<?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: Arif Hossain</title>
    <description>The latest articles on DEV Community by Arif Hossain (@ariflogs).</description>
    <link>https://dev.to/ariflogs</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%2F821499%2Ff20483b2-704c-4cff-a7f5-f39a6e9c8719.jpg</url>
      <title>DEV Community: Arif Hossain</title>
      <link>https://dev.to/ariflogs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ariflogs"/>
    <language>en</language>
    <item>
      <title>Most Unique UI Libraries Built On ShadCN!</title>
      <dc:creator>Arif Hossain</dc:creator>
      <pubDate>Sat, 17 Jan 2026 15:34:23 +0000</pubDate>
      <link>https://dev.to/ariflogs/most-unique-ui-libraries-built-on-shadcn-3bgf</link>
      <guid>https://dev.to/ariflogs/most-unique-ui-libraries-built-on-shadcn-3bgf</guid>
      <description>&lt;p&gt;If you’re tired of seeing the same generic websites, same layouts, same components, and AI slop, then check out the following UI libraries that can make your projects stand out.&lt;br&gt;
The best part? They all work great with ShadCN, so you can easily use them in your existing projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.8bitcn.com/" rel="noopener noreferrer"&gt;1. 8bitcn/ui&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;As the name suggests, 8bitcn is a retro, pixel-art–inspired UI library built by the legendary web warrior &lt;a href="https://x.com/orcdev" rel="noopener noreferrer"&gt;Orc Dev&lt;/a&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%2Fi4hepj244hpy4af89kxe.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%2Fi4hepj244hpy4af89kxe.png" alt="8bitcn Screenshot" width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Notable highlights
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pixel-style buttons, cards, and UI primitives.&lt;/li&gt;
&lt;li&gt;Strong retro gaming vibes.&lt;/li&gt;
&lt;li&gt;Fully open source with cool blocks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.retroui.dev" rel="noopener noreferrer"&gt;2. RetroUI&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Next up is RetroUI, a neo-brutalist styled UI library that unapologetically embraces bold design.&lt;br&gt;
So you will immediately notice bold typography, vibrant and high-contrast colors, and thick, dark shadows everywhere.&lt;/p&gt;

&lt;p&gt;And I’m the creator of RetroUI, so you have more reasons to try it 😄&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%2F2t2oasmwh2tc9pt3b7i2.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%2F2t2oasmwh2tc9pt3b7i2.png" alt="RetroUI Screenshot" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Notable highlights
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Components that feel tactile and fun to interact with.&lt;/li&gt;
&lt;li&gt;Theme support so you can adapt the brutalist look to your brand.&lt;/li&gt;
&lt;li&gt;Pro support that comes with templates and figma kit.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.tryelements.dev" rel="noopener noreferrer"&gt;3. Elements&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;While most UI libraries only handle the visuals, Elements takes a different approach. Instead of only giving you styled components, Elements provides full-stack shadcn/ui blocks, meaning you get both UI and functionality baked in.&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%2Fvowr7rdc8ik1kzlkaea4.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%2Fvowr7rdc8ik1kzlkaea4.png" alt="Elements Demo" width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It already has some popular integrations like Vercel AI Sdk, Polor payments, Uploadthing, and more coming soon.&lt;/p&gt;

&lt;h3&gt;
  
  
  What makes Elements different
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Prebuilt blocks that include logic, not just visuals.&lt;/li&gt;
&lt;li&gt;Covers common patterns like authentication, payments, AI integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://glass-ui.crenspire.com/" rel="noopener noreferrer"&gt;4. Glass UI&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Next on the list is Glass UI, a library focused entirely on glassmorphism. Here you will find frosted-glass cards, blurred backgrounds, and translucent panels with soft highlights and depth.&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%2F6zitdeazrdka7stevzfk.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%2F6zitdeazrdka7stevzfk.png" alt="GlassUI demo" width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you love Apple’s design language and want to give SwiftUI-style visuals on your website, then Glass UI is absolutely worth checking out.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://wigggle-ui.vercel.app/" rel="noopener noreferrer"&gt;5. Wiggle UI&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Wiggle UI is &lt;strong&gt;the first ever collection of widgets for the web.”&lt;/strong&gt; Instead of focusing on buttons, cards, or forms, it brings &lt;strong&gt;typical phone-style widgets to the web&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Think iOS and Android home screen widgets, but usable inside your website or web app.&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%2Fv9p3myweumbtpj5u3sfk.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%2Fv9p3myweumbtpj5u3sfk.png" alt="WiggleUI Demo" width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What makes Wiggle UI unique
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A curated collection of copy-paste widgets&lt;/li&gt;
&lt;li&gt;Inspired by iOS phone widgets&lt;/li&gt;
&lt;li&gt;Designed to drop directly into your project&lt;/li&gt;
&lt;li&gt;Comes with many variants, including whether, time, sports, media, and more.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;shadcn/ui gives you a solid foundation, but these libraries can give your projects a unique personality.&lt;/p&gt;

&lt;p&gt;Happy building 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>ui</category>
      <category>shadcn</category>
    </item>
    <item>
      <title>I built a React admin template in the age of AI slop!</title>
      <dc:creator>Arif Hossain</dc:creator>
      <pubDate>Tue, 14 Oct 2025 19:12:46 +0000</pubDate>
      <link>https://dev.to/ariflogs/i-built-a-react-admin-template-in-the-age-of-ai-slop-2bp4</link>
      <guid>https://dev.to/ariflogs/i-built-a-react-admin-template-in-the-age-of-ai-slop-2bp4</guid>
      <description>&lt;p&gt;I started working on an open-source component library called &lt;a href="https:://retroui.dev" rel="noopener noreferrer"&gt;RetroUI&lt;/a&gt; last year, with the goal of making building tools that make the web stand out!&lt;/p&gt;

&lt;p&gt;Since then, I have released tons of components, UI blocks, and website templates. All designed to bring bold, neo-brutalist design to life.&lt;/p&gt;

&lt;p&gt;🔥 Today, I’m excited to launch something new:&lt;/p&gt;

&lt;p&gt;Introducing brutadmin.com → an admin dashboard that doesn’t look boring.&lt;/p&gt;

&lt;p&gt;Right now, it includes eCommerce and SaaS dashboards, with Finance and Crypto pages coming soon.&lt;/p&gt;

&lt;p&gt;Please do consider checking it out and share what you think.&lt;/p&gt;

&lt;p&gt;preview link: &lt;a href="https://demo.brutadmin.com/" rel="noopener noreferrer"&gt;https://demo.brutadmin.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>nextjs</category>
      <category>uidesign</category>
    </item>
    <item>
      <title>I Deployed the Same App on Hetzner and DigitalOcean! | Cheap vs Expensive VPS</title>
      <dc:creator>Arif Hossain</dc:creator>
      <pubDate>Fri, 06 Dec 2024 08:01:29 +0000</pubDate>
      <link>https://dev.to/ariflogs/i-deployed-the-same-app-on-hetzner-and-digitalocean-cheap-vs-expensive-vps-jge</link>
      <guid>https://dev.to/ariflogs/i-deployed-the-same-app-on-hetzner-and-digitalocean-cheap-vs-expensive-vps-jge</guid>
      <description>&lt;p&gt;DigitalOcean has been my go-to for purchasing VPS for the past few years. However, recently, some cheaper cloud providers, particularly Hetzner, have been getting a lot of attention!&lt;/p&gt;

&lt;p&gt;In their cheapest plan, you can get 2 cores, 4 GB RAM, 40 GB SSD, and 20 TB bandwidth for just &lt;strong&gt;$4/month&lt;/strong&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%2F3x55o2e1jtllcd86yl1w.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%2F3x55o2e1jtllcd86yl1w.png" alt="Hetzner Pricing SS" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To get something similar on DigitalOcean, you’d need to pay &lt;strong&gt;$24/month&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Now on paper, it sounds like a great deal! and seems like a no-brainer to switch to Hetzner. But is there a catch? Is it as good as everyone claims? How much traffic can Hetzner’s cheapest plan handle compared to something like DigitalOcean?&lt;/p&gt;

&lt;p&gt;To find out, I deployed the same app on both platforms in the same region, compared their performance, and shared my findings in this video:&lt;/p&gt;

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

&lt;p&gt;If you’re in a hurry, here’s the result 👇&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Virtual Users&lt;/th&gt;
&lt;th&gt;Digital Ocean&lt;/th&gt;
&lt;th&gt;Hetzner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;593.4ms&lt;/td&gt;
&lt;td&gt;575.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;754.84ms&lt;/td&gt;
&lt;td&gt;626.04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;250&lt;/td&gt;
&lt;td&gt;1.4s+&lt;/td&gt;
&lt;td&gt;950.23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;6s&lt;/td&gt;
&lt;td&gt;1.8s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;$6/month&lt;/td&gt;
&lt;td&gt;$4/month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Building an UI library that does not look generic!</title>
      <dc:creator>Arif Hossain</dc:creator>
      <pubDate>Mon, 28 Oct 2024 11:29:39 +0000</pubDate>
      <link>https://dev.to/ariflogs/building-an-ui-library-that-does-not-look-generic-l82</link>
      <guid>https://dev.to/ariflogs/building-an-ui-library-that-does-not-look-generic-l82</guid>
      <description>&lt;p&gt;I'm love retro-styled UIs, it can definitely give a cool look and make your website standout.&lt;/p&gt;

&lt;p&gt;But most of the UI libraries out there are pretty generic and I couldn't find any that has a design language that I was looking for.. So I decided to build one myself!&lt;/p&gt;

&lt;p&gt;Introducing RetroUI, a retro-styled UI library based on React and TailwindCSS. Would really appreciate you checking it out and leave a star in the Github repo if you like it. 💜&lt;/p&gt;

&lt;p&gt;URL: &lt;a href="https://retroui.dev" rel="noopener noreferrer"&gt;https://retroui.dev&lt;/a&gt;&lt;br&gt;
Repo: &lt;a href="https://github.com/logging-stuff/retroui" rel="noopener noreferrer"&gt;https://github.com/logging-stuff/retroui&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ui</category>
      <category>react</category>
      <category>tailwindcss</category>
    </item>
    <item>
      <title>Create AWS EC2 Instance With Key Pairs Using Terraform</title>
      <dc:creator>Arif Hossain</dc:creator>
      <pubDate>Thu, 26 Jan 2023 05:33:23 +0000</pubDate>
      <link>https://dev.to/ariflogs/create-aws-ec2-instance-with-key-pairs-using-terraform-3ihe</link>
      <guid>https://dev.to/ariflogs/create-aws-ec2-instance-with-key-pairs-using-terraform-3ihe</guid>
      <description>&lt;p&gt;Terraform has become one of my favorite tools I tried out recently. If you are reading this article, then I’m guessing you are already familiar with it. But if not, check out this 👉 &lt;a href="https://developer.hashicorp.com/terraform/intro" rel="noopener noreferrer"&gt;introduction&lt;/a&gt; to get some basics first.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Write configuration&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;For this tutorial, we will primarily use 3 &lt;em&gt;tf&lt;/em&gt; config files. Let’s create a dedicated directory to store them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;aws-ec2-with-key-pairs
&lt;span class="nb"&gt;cd &lt;/span&gt;aws-ec2-with-key-pairs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we are in the directory, create the config files and open them on your favorite code editor. I’m using &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;Visual Studio Code&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;main.tf variable.tf output.tf
code &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="http://variable.tf" rel="noopener noreferrer"&gt;&lt;strong&gt;variable.tf&lt;/strong&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;This is where we will save our config variables which will be used in &lt;a href="http://main.tf" rel="noopener noreferrer"&gt;&lt;em&gt;main.tf&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;variable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"instance-region"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;description&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Value of AWS region"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;type&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;default&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eu-central-1"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;variable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"instance-name"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;description&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Value of the Name tag for the EC2 instance"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;type&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;default&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OverEngineeredVPS"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;variable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"key-pair"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;description&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Value of AWS SSH key-pair name"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;type&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;default&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"oei-key-pair"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="http://main.tf" rel="noopener noreferrer"&gt;&lt;strong&gt;main.tf&lt;/strong&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Let’s use the variables we set to create an EC2 instance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;terraform&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;required_providers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;aws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;source&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hashicorp/aws&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;~&amp;gt; 4.16&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;required_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;= 1.2.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tls_private_key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;oei-key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;algorithm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;RSA&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="nx"&gt;rsa_bits&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4096&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aws_key_pair&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;oei-key-pair&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;key_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;oei-key-pair&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="nx"&gt;public_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tls_private_key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;oei&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;public_key_openssh&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aws&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;region&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aws_instance&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;oei-server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ami&lt;/span&gt;           &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ami-09042b2f6d07d164a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;// for frankfurt + ubuntu&lt;/span&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;t2.small&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;// $0.023/H&lt;/span&gt;
  &lt;span class="nx"&gt;key_name&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;oei-key-pair&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

  &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now if we run this file, it will create an ec2 server on &lt;strong&gt;eu-central-1(&lt;/strong&gt;as we specified in &lt;a href="http://variable.tf" rel="noopener noreferrer"&gt;&lt;em&gt;variable.tf&lt;/em&gt;&lt;/a&gt;) with a key-pair called &lt;strong&gt;oei-key-pair&lt;/strong&gt;. But if you wish to use a different location, make sure to change your &lt;strong&gt;ami&lt;/strong&gt; value according to the &lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/finding-an-ami.html" rel="noopener noreferrer"&gt;AWS configuration&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="http://output.tf" rel="noopener noreferrer"&gt;&lt;strong&gt;output.tf&lt;/strong&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;We will use this file to output the results on the console.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;instance_id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ID of the EC2 instance&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;oei&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;instance_public_ip&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Public IP address of the EC2 instance&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;oei&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;public_ip&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;instance_public_DNS&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Public IP address of the EC2 instance&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;oei&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;public_dns&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;instance_public_key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Public key of oe-key-pair&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tls_private_key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;oei&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;public_key_openssh&lt;/span&gt;
  &lt;span class="nx"&gt;sensitive&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;instance_private_key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Private key of oe-key-pair&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="nx"&gt;tls_private_key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;oei&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;private_key_pem&lt;/span&gt;
  &lt;span class="nx"&gt;sensitive&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice I used the &lt;strong&gt;&lt;em&gt;sensitive&lt;/em&gt;&lt;/strong&gt; flag on &lt;strong&gt;instance_public_key&lt;/strong&gt; &amp;amp; &lt;strong&gt;instance_private_key&lt;/strong&gt; so that it does not show the plain output by default.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Apply the configuration&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Now that we have written our config file, let’s run these 👇🏼 commands to let Terraform do its job.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;terraform&lt;/span&gt; &lt;span class="nx"&gt;init&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will download and install the AWS plugins for the providers we used. After the installation is done, run &lt;code&gt;terraform plan&lt;/code&gt; to see the changes that will take place on the infrastructure. If everything looks alright, let’s apply the changes by running 👇🏼&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;terraform&lt;/span&gt; &lt;span class="nx"&gt;apply&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will take some time. But once it is done, you should be able to run &lt;code&gt;terraform output&lt;/code&gt; to see the results we specified on &lt;a href="http://output.tf" rel="noopener noreferrer"&gt;&lt;em&gt;output.tf&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&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%2Fuurd32wybcc9iuf4d7d7.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%2Fuurd32wybcc9iuf4d7d7.png" alt=" " width="800" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To check the sensitive output, just run &lt;code&gt;terraform output -raw “key name”&lt;/code&gt;. Example: 👇🏼&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%2F1ht6ldopvbvk80o9kgwn.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%2F1ht6ldopvbvk80o9kgwn.png" alt=" " width="800" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Thanks for reading the article guys. Hope it helped!&lt;/p&gt;

</description>
      <category>motivation</category>
      <category>gratitude</category>
    </item>
    <item>
      <title>I used both Code and No-Code tools to launch my product within a weekend!</title>
      <dc:creator>Arif Hossain</dc:creator>
      <pubDate>Sun, 04 Dec 2022 00:58:41 +0000</pubDate>
      <link>https://dev.to/ariflogs/i-used-both-code-and-no-code-tools-to-launch-my-product-within-a-weekend-3gfp</link>
      <guid>https://dev.to/ariflogs/i-used-both-code-and-no-code-tools-to-launch-my-product-within-a-weekend-3gfp</guid>
      <description>&lt;p&gt;Yesterday I launched a small side project called &lt;a href="https://indiehacks.link" rel="noopener noreferrer"&gt;IndieHacks&lt;/a&gt; and the goal was to finish this within a weekend.&lt;/p&gt;

&lt;p&gt;Now when the time is this short, It doesn't make much sense to code the whole thing but I also can't go full no-code since this is a free project most no-code site builders require a subscription.&lt;/p&gt;

&lt;p&gt;But I think I found a sweet spot By using Airtable as the database and NextJS. Here's how it works 👇🏼&lt;/p&gt;

&lt;h3&gt;
  
  
  Collecting &amp;amp; Storing Data
&lt;/h3&gt;

&lt;p&gt;I placed an "Add New Product" button on the site navbar, Clicking that opens up the &lt;a href="https://tally.so" rel="noopener noreferrer"&gt;TallyForm&lt;/a&gt; widget.&lt;/p&gt;

&lt;p&gt;Besides offering such a nice &amp;amp; clean UI, Tally also has some cool integrations including AirTable. So now when a user submits the form, Tally sends the data to my Aritable database.&lt;/p&gt;

&lt;p&gt;The great thing about Airtable is it makes it really easy to access its DB data through API. That saved a lot of API building &amp;amp; management time from my end! 😁&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;EXAMPLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;REQUEST&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;curl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.airtable.com/v0/YOUR_API_ID/products"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;-H&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Authorization: Bearer YOUR_API_KEY"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;EXAMPLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;RESPONSE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"records"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"createdTime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2022-12-01T22:52:32.000Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"fields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"Alternative"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Google Forms, Typeform, Jotform"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"Logo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://global-uploads.webflow.com/62014002185c7b256316ef63/6227d89b340c3b27961d2158_60e345d1f48cea70e9934764_Tally.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"Website"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tally.so"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tally"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"Twitter Handle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TallyForms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"createdTime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2022-12-02T12:26:34.000Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"fields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"Alternative"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MicroAcquire"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"Logo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://storage.googleapis.com/indie-hackers.appspot.com/product-avatars/acquirebase/200x200_acquirebase.webp?1669984457278"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"Website"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"acquirebase.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AcquireBase"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"Twitter Handle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"acquirebase"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Retrieving Data &amp;amp; UI
&lt;/h3&gt;

&lt;p&gt;I wrote this &lt;code&gt;getStaticProps&lt;/code&gt; function to call the Airtable API which will &lt;code&gt;revalidate&lt;/code&gt; every 10min. Now I wanted to only show the data that is published/reviewed by me but couldn't find exactly what I was looking for, so I added an extra look that I'm not very proud of 🥲&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getStaticProps&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&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;https://api.airtable.com/v0/YOUR_API_ID/products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bearer YOUR_API_TOKEN&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;records&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pro&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;pro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Published&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;products&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;revalidate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&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;p&gt;Then I just looped through the data in UI and with TailwindCSS, made the site look like this.&lt;/p&gt;

&lt;h3&gt;
  
  
  Analytics
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://umami.is" rel="noopener noreferrer"&gt;Umami&lt;/a&gt; is definitely one of my favorite website analytics tools. Besides being open source they have a very flawless way to self-host.&lt;/p&gt;

&lt;p&gt;So thanks to umami &amp;amp; &lt;a href="https://railway.app" rel="noopener noreferrer"&gt;Railway&lt;/a&gt; was quickly able set up the analytics. Here's a sharable link in case you wanna check it out 👉&lt;a href="https://analytics.indiehacks.link/share/NZkL6cYS/IndieHacks" rel="noopener noreferrer"&gt;https://analytics.indiehacks.link/share/NZkL6cYS/IndieHacks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading, Feel free to visit &lt;a href="https://indiehacks.link" rel="noopener noreferrer"&gt;IndieHacks&lt;/a&gt;. We will soon launch on Product Hunt. So would really appreciate your support.&lt;/p&gt;

</description>
      <category>career</category>
      <category>computerscience</category>
      <category>java</category>
      <category>postgres</category>
    </item>
    <item>
      <title>I built a website like the “good old” days.</title>
      <dc:creator>Arif Hossain</dc:creator>
      <pubDate>Sun, 25 Sep 2022 01:32:54 +0000</pubDate>
      <link>https://dev.to/ariflogs/i-built-a-website-like-the-good-old-days-31f7</link>
      <guid>https://dev.to/ariflogs/i-built-a-website-like-the-good-old-days-31f7</guid>
      <description>&lt;p&gt;I started learning we Dev back in 2018 and till now all projects I have worked on were API based.&lt;br&gt;
So I never had the experience/felt the need of building projects in the "good old" days. Like when that was used to render everything on the server, the era of MVC, LAMP stack, jQuery, Ajax, etc. So whenever I heard senior developers explaining the pros &amp;amp; cons of serving clients from the server, I kinda got the theories, but never truly resonated with them.&lt;br&gt;
Until recently, thanks to my DBMS course project, I built indiehacks.link with Laravel and Blade template engine following MVC pattern.&lt;/p&gt;

&lt;p&gt;BTW I'm happy to announce that now I finally understand why people say NextJS routing is inspired by PHP. 😬&lt;br&gt;
Ok, Let's discuss some of my positive and negative experiences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Positives:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  👉 It just felt "chill".
&lt;/h3&gt;

&lt;p&gt;I just wrote codes for each page and it just worked. I didn't have to stress about building multiple APIs and how the front end will pass the required parameters or consume the response.&lt;br&gt;
Also, there was no headache of frontend state management either! So overall it's much easier, at least on the frontend side.&lt;/p&gt;

&lt;h3&gt;
  
  
  👉 I loved Laravel!
&lt;/h3&gt;

&lt;p&gt;It has a built-in solution for all basic needs. Tired of building auth solutions over and over? Building CRUD routes? Integrating payments solution? Just run a few Laravel commands and it's Done!!&lt;br&gt;
Normally I don't like heavy frameworks but IDK why but Laravel felt "organized" and easy to adopt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Negatives:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  👉 Everything felt "slow".
&lt;/h3&gt;

&lt;p&gt;I'm sure this is primarily because of my lack of knowledge on how to improve server-rendered sites!&lt;br&gt;
Like here in this case I need to search for projects by my name. I had no idea how I can pass this data to the server! So guess what I did? I pushed the search query to the URL params, which resulted in a full page load!!&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%2Ful8kyjqbbbfnq62lsc91.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%2Ful8kyjqbbbfnq62lsc91.png" alt="Query SS" width="800" height="508"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;IDK if this could be improved my AJAX or something or if I'm just doing it wrong. But this does feel I need to use different solutions to improve the performance, which we get out of the box in modern tech stacks.&lt;/p&gt;

&lt;h3&gt;
  
  
  👉 Felt less reusable.
&lt;/h3&gt;

&lt;p&gt;As someone who prefers JSX over plain HTML, I'm used to thinking of UI as different components. Though this can be done with Laravel Blade to some extent, But I found it very hard to make this reusable compared to the modern frontend frameworks.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I'm moving my SAAS to a monorepo and how Turborepo is helping me to do so!!</title>
      <dc:creator>Arif Hossain</dc:creator>
      <pubDate>Sat, 26 Mar 2022 00:21:34 +0000</pubDate>
      <link>https://dev.to/ariflogs/im-moving-my-saas-to-a-monorepo-and-how-turborepo-is-helping-me-to-do-so-4j1g</link>
      <guid>https://dev.to/ariflogs/im-moving-my-saas-to-a-monorepo-and-how-turborepo-is-helping-me-to-do-so-4j1g</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;NOTE: this is not a tutorial! I'm just sharing my use case, experience, and knowledge so far. Which TBH isn't a lot but I felt like writing a blog, so... 🤷&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Back Story
&lt;/h3&gt;

&lt;p&gt;If you read my last &lt;a href="https://ariflogs.com/my-first-official-saas-is-now-live" rel="noopener noreferrer"&gt;blog&lt;/a&gt;, You may know I recently launched my SAAS &lt;a href="Https://studymerge.com"&gt;studymerge&lt;/a&gt; to make collaboration with classmates easy and productive. &lt;/p&gt;

&lt;p&gt;The tech stack I used to build the beta is Typescript, NextJS &amp;amp; Supabase, and used a regular single repository on GitHub to manage git. Which seemed fine as I only had a single codebase to manage. &lt;br&gt;
But after launching the beta the first thing I needed to launch is a landing page and set up Supabase locally for local development.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why Monorepo??
&lt;/h3&gt;

&lt;p&gt;Now I had 2 options, Either I could create multiple repositories for each project or create a single monorepo and have less headache and better code sharing between projects. I don't know if you can guess, but the 2nd option seemed much more compelling to me!&lt;/p&gt;

&lt;p&gt;But!! the only problem is I don't have much experience in monorepo. I mean I've been working on a monorepo codebase for the past couple of months but never used any tool to manage such projects and the only 2 tools I heard of were &lt;strong&gt;NX&lt;/strong&gt; &amp;amp; &lt;strong&gt;Turborepo&lt;/strong&gt;, thanks to &lt;strong&gt;fireship's&lt;/strong&gt; youtube video.&lt;/p&gt;

&lt;p&gt;%[&lt;a href="https://www.youtube.com/watch?v=9iU_IE6vnJ8" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=9iU_IE6vnJ8&lt;/a&gt;]&lt;/p&gt;
&lt;h3&gt;
  
  
  Why Turborepo??
&lt;/h3&gt;

&lt;p&gt;So after doing some more research, I decided to go with Turborepo as it seemed easier to get into and the docs have a dark theme by default. 😶&lt;/p&gt;

&lt;p&gt;Heard a lot of great stuff about NX as well but it seemed to have a higher learning curve and I didn't wanna make my small project more complicated than it needs to be. &lt;/p&gt;
&lt;h3&gt;
  
  
  Features (That I experienced)
&lt;/h3&gt;

&lt;p&gt;TBH I still haven't explored most of the features of Turborepo yet but I will try to give a brief of things that I have learned and how it's implemented on my project. If you wanna learn things in detail do checkout the &lt;a href="https://turborepo.org/docs/getting-started" rel="noopener noreferrer"&gt;docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here are a few things I explored so far:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;File Structure&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you create a new project by running&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-turbo@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
, your project should have 2 root level folders &lt;strong&gt;apps&lt;/strong&gt; &amp;amp; &lt;strong&gt;packages&lt;/strong&gt;. There's also a &lt;code&gt;turbo.json&lt;/code&gt; file, which I believe can be used to config Turborepo.&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%2F3eqfutk7mwsz76ydme3x.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%2F3eqfutk7mwsz76ydme3x.png" alt="Screenshot from 2022-03-13 04-40-02.png" width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All your different projects will live in &lt;strong&gt;apps&lt;/strong&gt; and things like components, configs will live in the &lt;strong&gt;packages&lt;/strong&gt; folder.&lt;br&gt;
In my case, I have my docs, landing, and web app inside &lt;strong&gt;apps&lt;/strong&gt; and my Supbabase local setup, shared components, and config inside &lt;strong&gt;packages&lt;/strong&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%2Fg0wopo9wvffco8ezhspa.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%2Fg0wopo9wvffco8ezhspa.png" alt="Screenshot from 2022-03-13 13-28-35.png" width="800" height="173"&gt;&lt;/a&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%2F09zpxwww5c1gyz4dkdle.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%2F09zpxwww5c1gyz4dkdle.png" alt="Screenshot from 2022-03-13 13-29-03.png" width="800" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This just felt "right". I don't have to think about creating a proper file system, Turbo just did this for me, and with this structure, I can easily share my brand components with all projects. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Caching&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Production &lt;code&gt;build&lt;/code&gt; takes time and sometimes when you are &lt;code&gt;build&lt;/code&gt; a large project, it can take &lt;strong&gt;a lot&lt;/strong&gt; of time! Thanks to turbo my project seemed to build very fast after the first initial build. &lt;br&gt;
I haven't found any drawbacks yet, but so far this caching feels really helpful.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pipelining&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's a cool diagram on Turborepo's docs on how you can specify your tasks relationships to make your tasks executions fasters. 🏃&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%2Fz7jnhde5gufodhm7f22p.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%2Fz7jnhde5gufodhm7f22p.png" alt="turbo-vs-lerna-execution.png" width="800" height="471"&gt;&lt;/a&gt;&lt;br&gt;
Now I haven't used Lerna before, so I can't really differentiate. But based on this diagram and theory my tasks executions are faster right? Idk I will let you know more when I know more. 😶&lt;/p&gt;

&lt;p&gt;There are also some other features like &lt;strong&gt;Scoped Tasks&lt;/strong&gt;, &lt;strong&gt;Remote Caching&lt;/strong&gt; which I haven't tried yet.   Will definitely update this blog when I do. You can check out a detailed Demo and Walkthrough video by &lt;a href="https://twitter.com/jaredpalmer" rel="noopener noreferrer"&gt;Jared Palme&lt;/a&gt; if are interested to learn more.&lt;/p&gt;

&lt;p&gt;%[&lt;a href="https://www.youtube.com/watch?v=YX5yoApjI3M" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=YX5yoApjI3M&lt;/a&gt;]&lt;/p&gt;

&lt;h3&gt;
  
  
  Self Promotion
&lt;/h3&gt;

&lt;p&gt;Ok. Self Promotion time, Join my newsletter I guess.😶&lt;/p&gt;

</description>
      <category>git</category>
      <category>monorepo</category>
      <category>turborepo</category>
      <category>github</category>
    </item>
    <item>
      <title>My first "official" SAAS is now live!!🙌 Introducing studymerge.com. Well.. beta.studymerge.com</title>
      <dc:creator>Arif Hossain</dc:creator>
      <pubDate>Sat, 19 Mar 2022 00:47:28 +0000</pubDate>
      <link>https://dev.to/ariflogs/my-first-official-saas-is-now-live-introducing-studymergecom-well-betastudymergecom-1b76</link>
      <guid>https://dev.to/ariflogs/my-first-official-saas-is-now-live-introducing-studymergecom-well-betastudymergecom-1b76</guid>
      <description>&lt;p&gt;Last week I promised myself and Twitter that I will launch the beta version of my product &lt;a href="https://studymerge.com" rel="noopener noreferrer"&gt;StudyMerge&lt;/a&gt; on 1st merch. Now I'm glad to say I kept my promise. Also, I managed to get 32 people to join the waitlist. 💃💃 &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%2Fzti4h4w6dyyo16infmvr.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%2Fzti4h4w6dyyo16infmvr.png" alt="Screenshot from 2022-02-28 20-48-46.png" width="600" height="334"&gt;&lt;/a&gt;&lt;br&gt;
Thanks to everyone who joined and willing to try out this early version of the software. 🙏🏻&lt;/p&gt;

&lt;p&gt;Anyways, I much I wanted to, I couldn't manage the time to build a proper landing page yet. So I'm writing this blog to kind of explain the product and its features.&lt;/p&gt;

&lt;h3&gt;
  
  
  Elevator Pitch
&lt;/h3&gt;

&lt;p&gt;At its core, StudyMerge is a software targeting students to study, work and collaborate with classmates efficiently.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does it work?
&lt;/h3&gt;

&lt;p&gt;Well, that's a good question. In fact, that is why I'm writing this blog. 😬 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session&lt;/strong&gt; and &lt;strong&gt;Participant&lt;/strong&gt;. These 2 core features work together to make collaboration between you and your classmates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The product is built around &lt;strong&gt;sessions&lt;/strong&gt; and for each session, you can have multiple &lt;strong&gt;topics&lt;/strong&gt;. You can think of it as tasks and sub-tasks. &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%2F8wc7sh2h6ptosyf9n6sj.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%2F8wc7sh2h6ptosyf9n6sj.png" alt="Screenshot from 2022-02-28 21-09-22.png" width="800" height="457"&gt;&lt;/a&gt;&lt;br&gt;
Here I'm using one of my classes as a session and things that I need to study for the class as topics. Once you have some sessions that you created or participated in, Your homepage should kind of look like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqy2nbt1e6eip9psfbutf.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%2Fqy2nbt1e6eip9psfbutf.png" alt="Screenshot from 2022-02-28 21-40-06.png" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Perticipant&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now once you have a session, You can invite your classmates into the session. From the top right corner, you should have a menu button to add participants. (Before adding someone to a session, make sure you have them on your friend list)&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%2Fq0iy18eypg07x1pvn91i.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%2Fq0iy18eypg07x1pvn91i.png" alt="Screenshot from 2022-02-28 21-55-02.png" width="673" height="319"&gt;&lt;/a&gt;&lt;br&gt;
Great, now that you invited your friends to your &lt;strong&gt;session&lt;/strong&gt;, they should get an invitation which they can accept or reject. &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%2F41kwh1otqpc4zilpzgtu.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%2F41kwh1otqpc4zilpzgtu.png" alt="Screenshot from 2022-02-28 21-50-56.png" width="663" height="159"&gt;&lt;/a&gt;&lt;br&gt;
If they accept, they will get a &lt;strong&gt;copy&lt;/strong&gt; of your session blueprint and now you can both track each other's session progress from the &lt;strong&gt;participants&lt;/strong&gt; page.&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%2Fd89ii2z76s2ottxc0wnm.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%2Fd89ii2z76s2ottxc0wnm.png" alt="Screenshot from 2022-02-28 21-52-59.png" width="682" height="377"&gt;&lt;/a&gt;&lt;br&gt;
That's it. that's all the features that are live right now. Hopefully, I explained it well and made you somewhat existed to try out the product.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;p&gt;I tried my best not to &lt;strong&gt;overengineer&lt;/strong&gt; this project as it would have taken me 2years to launch the beta. 😶&lt;br&gt;
So I choose &lt;strong&gt;Supabase&lt;/strong&gt; for my primary backend and hand's down it was a great decision. On the Frontend, I primarily used Typescript, NextJS, and ChakraUI.&lt;/p&gt;

&lt;h3&gt;
  
  
  What next?
&lt;/h3&gt;

&lt;p&gt;I have a couple of new features that I'm working on right now which will be live soon.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Discussion:&lt;/strong&gt; In every session there will be a Discussion panel where session participants will be able to discuss or have a group chat related to the session.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File Upload:&lt;/strong&gt; I guess it's self-explanatory, Basically you will be able to share notes/attachments /questions or any type of files with your session participants.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Calendar:&lt;/strong&gt; I love Google Calendar, I think it's one of the best tools available to manage your time. So I'm looking forward to integrating Google Calendar with StudyMerge. So students can schedule sessions, classes, or group study time.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How does the pricing work?
&lt;/h3&gt;

&lt;p&gt;Well TBH I'm sure about the pricing yet, The product will be free in the beta phase. Later I might add pricing for "File Uploads" and some additional features? IDK... Will see.&lt;/p&gt;

&lt;h3&gt;
  
  
  Need your feedback
&lt;/h3&gt;

&lt;p&gt;So what do you think? Definitely the next 🦄?&lt;/p&gt;

&lt;p&gt;Jokes aside (if you can call it a joke 😶), I would really love to get your feedback, especially if you are a student. Visit &lt;a href="https://studymerge.com" rel="noopener noreferrer"&gt;stduymerge.com&lt;/a&gt; to try it out. For any kind of feature request, bug report or feedback email me at &lt;strong&gt;&lt;a href="mailto:arif@studymerge.com"&gt;arif@studymerge.com&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Also, I'm thinking of making this series where I may post 1/2 blogs each month updating you guys about both the business and tech sides of the project. "Build in public" you may say.&lt;br&gt;
Do subscribe to my newsletter. ✌️&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
