<?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: Kaustubh</title>
    <description>The latest articles on DEV Community by Kaustubh (@kawasthi2889).</description>
    <link>https://dev.to/kawasthi2889</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%2F2130508%2F9f08b673-3dc9-4ef5-ad08-33364888ee7d.png</url>
      <title>DEV Community: Kaustubh</title>
      <link>https://dev.to/kawasthi2889</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kawasthi2889"/>
    <language>en</language>
    <item>
      <title>🚀 Introducing Pblog – A Dockerized TUI Blogging App</title>
      <dc:creator>Kaustubh</dc:creator>
      <pubDate>Mon, 17 Mar 2025 13:49:17 +0000</pubDate>
      <link>https://dev.to/kawasthi2889/introducing-pblog-a-dockerized-tui-blogging-app-357b</link>
      <guid>https://dev.to/kawasthi2889/introducing-pblog-a-dockerized-tui-blogging-app-357b</guid>
      <description>&lt;h2&gt;
  
  
  👋 Hey Dev Community!
&lt;/h2&gt;

&lt;p&gt;Let me introduce you all to my latest project: &lt;a href="https://github.com/KAwasthi2889/PBlog" rel="noopener noreferrer"&gt;&lt;strong&gt;Pblog&lt;/strong&gt;&lt;/a&gt;! 🎉 &lt;/p&gt;

&lt;p&gt;Pblog is a &lt;strong&gt;Dockerized terminal-based user interface (TUI) blogging application&lt;/strong&gt; designed to make blog management seamless. It allows users to &lt;strong&gt;create, read, update, and delete posts&lt;/strong&gt; efficiently while supporting &lt;strong&gt;similarity-based search&lt;/strong&gt; and &lt;strong&gt;paginated fetching&lt;/strong&gt; for optimized performance and to prevent database overload.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 Why This Project?
&lt;/h2&gt;

&lt;p&gt;I started this project as a way to learn &lt;strong&gt;Docker&lt;/strong&gt; and how to integrate a database into a backend. Through this journey, I discovered how a database like &lt;strong&gt;PostgreSQL&lt;/strong&gt; communicates with another container over the same network, and it was a game-changer! 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;📝 CRUD Operations – Manage Your Blog with Ease&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Pblog provides an intuitive way to handle blog posts with confirmation prompts and error handling.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create a Post&lt;/strong&gt; 📝&lt;br&gt;&lt;br&gt;
Effortlessly add new blog entries.&lt;br&gt;&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%2Fuvriuy65na6956kuh5j2.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%2Fuvriuy65na6956kuh5j2.png" alt="Post Creation Screenshot" width="800" height="182"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Read a Post&lt;/strong&gt; 📖&lt;br&gt;&lt;br&gt;
View detailed content with ease.&lt;br&gt;&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%2F6koot38ljkz7gm2po057.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%2F6koot38ljkz7gm2po057.png" alt="Post Content Screenshot" width="800" height="156"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Update a Post&lt;/strong&gt; ✏️&lt;br&gt;&lt;br&gt;
Automatically pre-fills previous content for quick editing.&lt;br&gt;&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%2Flp8tr44yyv0kv9l1n78y.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%2Flp8tr44yyv0kv9l1n78y.png" alt="Post Update Screenshot" width="800" height="196"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CRUD with Confirmation&lt;/strong&gt; ✅&lt;br&gt;&lt;br&gt;
A confirmation of work done.&lt;br&gt;&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%2Fulm2uucnbsiwhjadr1s6.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%2Fulm2uucnbsiwhjadr1s6.png" alt="Confirmation Screenshot" width="414" height="146"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Error Handling&lt;/strong&gt; ⚠️&lt;br&gt;&lt;br&gt;
Robust validation and user-friendly error messages.&lt;br&gt;&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%2F3fvn6lc0wmrkk117awkn.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%2F3fvn6lc0wmrkk117awkn.png" alt="Error Handling Screenshot" width="412" height="135"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔍 &lt;strong&gt;Advanced Search Capabilities&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ID-Based Search&lt;/strong&gt; 🔢&lt;br&gt;&lt;br&gt;
Retrieve posts using a unique identifier.&lt;br&gt;&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%2Fo04jbzbj5bpt3i2mb03g.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%2Fo04jbzbj5bpt3i2mb03g.png" alt="ID Search Screenshot" width="193" height="87"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Similarity-Based Search&lt;/strong&gt; 🧐&lt;br&gt;&lt;br&gt;
Find posts based on content relevance.&lt;br&gt;&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%2Fslvgesauqoklfn136fnn.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%2Fslvgesauqoklfn136fnn.png" alt="Choice Screenshot" width="480" height="153"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Paginated Fetching&lt;/strong&gt; 📌&lt;br&gt;&lt;br&gt;
Optimizes performance by fetching posts in batches.&lt;br&gt;&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%2Fgxw1xb5618vrgo02zlv6.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%2Fgxw1xb5618vrgo02zlv6.png" alt="Title Search Screenshot" width="800" height="168"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Technical Details
&lt;/h2&gt;

&lt;p&gt;Pblog is built using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; 🐳 – For containerization and environment consistency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go&lt;/strong&gt; 🚀 – Chosen for its concurrency, performance, and simplicity in backend development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL&lt;/strong&gt; 🛢️ – Reliable, scalable, and feature-rich database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GORM&lt;/strong&gt; 🔌 – An ORM that simplifies database interactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tview&lt;/strong&gt; 🎨 – A powerful library for building TUI applications in Go.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ Challenges Faced &amp;amp; Solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ Switching Focus in TUI 🖥️
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Initially, I struggled to shift focus between different sections of the TUI.&lt;br&gt;
&lt;strong&gt;Solution:&lt;/strong&gt; Using &lt;code&gt;tview.Pages&lt;/code&gt;, I was able to split the TUI into different sections and switch between them dynamically.&lt;/p&gt;

&lt;h3&gt;
  
  
  2️⃣ Docker Compose Database Integration 🐳🔗
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; The app couldn't communicate with the PostgreSQL database container.&lt;br&gt;
&lt;strong&gt;Solution:&lt;/strong&gt; The issue was that the app sometimes started before the database was fully ready. Adding &lt;code&gt;depends_on&lt;/code&gt; in &lt;code&gt;docker-compose.yml&lt;/code&gt; ensured the database initialized before the app started.&lt;/p&gt;

&lt;h3&gt;
  
  
  3️⃣ Terminal Capture Issue ⌨️
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; The database logs occupied the terminal, preventing the app from displaying the TUI.&lt;br&gt;
&lt;strong&gt;Solution:&lt;/strong&gt; Running the compose setup in &lt;strong&gt;detached mode (&lt;code&gt;-d&lt;/code&gt;)&lt;/strong&gt; and then using &lt;code&gt;docker attach&lt;/code&gt; on the app container ensured the TUI appeared correctly.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 What's Next?
&lt;/h2&gt;

&lt;p&gt;🔍 &lt;strong&gt;Search Filtering&lt;/strong&gt; – Filter results through categories.&lt;br&gt;&lt;br&gt;
🔐 &lt;strong&gt;Authentication&lt;/strong&gt; – Implement login and write permissions.&lt;br&gt;&lt;br&gt;
🏷️ &lt;strong&gt;User Preferences&lt;/strong&gt; – Recommend posts based on tags.&lt;br&gt;&lt;br&gt;
💰 &lt;strong&gt;Payment Gateway&lt;/strong&gt; – Enable monetization options.&lt;br&gt;&lt;br&gt;
🏗️ &lt;strong&gt;PostgreSQL Deployment&lt;/strong&gt; – Deploy on a public server for worldwide sharing.  &lt;/p&gt;




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

&lt;p&gt;Thanks for making it this far! 🙌 This journey was &lt;strong&gt;incredibly rewarding&lt;/strong&gt; as I went from knowing very little about Docker and database integration to &lt;strong&gt;building a fully functional application&lt;/strong&gt;. If you find this project useful, check it out on GitHub and feel free to contribute! 🚀&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/KAwasthi2889/PBlog" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Happy coding! 😃&lt;/p&gt;

</description>
      <category>docker</category>
      <category>opensource</category>
      <category>postgres</category>
      <category>go</category>
    </item>
    <item>
      <title>My Journey with Go and Two Practice Projects</title>
      <dc:creator>Kaustubh</dc:creator>
      <pubDate>Fri, 31 Jan 2025 16:09:38 +0000</pubDate>
      <link>https://dev.to/kawasthi2889/my-journey-with-go-and-two-practice-projects-1lho</link>
      <guid>https://dev.to/kawasthi2889/my-journey-with-go-and-two-practice-projects-1lho</guid>
      <description>&lt;p&gt;Hi Devs 👋&lt;/p&gt;

&lt;p&gt;I’m thrilled to share my journey of learning Go and how it led me to build two practice projects. This has been a rewarding learning experience, and I’m excited to share my learnings with you all.&lt;/p&gt;

&lt;p&gt;🚀 Starting the Journey&lt;/p&gt;

&lt;p&gt;I began my Go journey with "A Tour of Go" and freeCodeCamp. I explored Go’s:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data Structures&lt;/strong&gt;: Structs, arrays, slices, and maps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Behaviours&lt;/strong&gt;: Methods, interfaces, and type assertions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concurrency&lt;/strong&gt;: Goroutines and channels.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Concepts&lt;/strong&gt;: Generics, pointers, readers, and image manipulation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a long time I loved C but had to part ways with it as it didn't support OOP and was highly memory unsafe. That's where I found Go, which was similar to C but had all the features that I missed in C. Including some of the dynamic aspects that made me choose this over C++.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;🌟 Task Tracker CLI&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;One of my first projects with Go was a CLI Task Tracker Tool, which made me practice JSON parsing and file handling.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Add&lt;/em&gt;, &lt;em&gt;view&lt;/em&gt;, &lt;em&gt;update&lt;/em&gt;, and &lt;em&gt;delete&lt;/em&gt; tasks directly from the terminal.&lt;/li&gt;
&lt;li&gt;Track the status of your task: &lt;em&gt;pending&lt;/em&gt;, &lt;em&gt;in-progress&lt;/em&gt;, &lt;em&gt;skipped&lt;/em&gt;, and &lt;em&gt;completed&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Data Persistence: Stores the tasks in a JSON file of the current directory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Lessons Learned:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;File handling with Go.&lt;/li&gt;
&lt;li&gt;JSON Marshalling/Unmarshalling.&lt;/li&gt;
&lt;li&gt;Taking command line arguments.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can find the project here: &lt;a href="https://github.com/KAwasthi2889/Task-Tracker-CLI" rel="noopener noreferrer"&gt;CLI Task Tracker&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌟 GitHub User Activity Tracker
&lt;/h2&gt;

&lt;p&gt;Building on the momentum, I created GitHub User Activity Tracker, a tool for listing public GitHub contributions with just a username using GitHub's API.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Tracks &lt;em&gt;commits&lt;/em&gt;, &lt;em&gt;PRs&lt;/em&gt;, &lt;em&gt;issues&lt;/em&gt;, and &lt;em&gt;contribution&lt;/em&gt; history.&lt;/li&gt;
&lt;li&gt;Provides an easy way to monitor and celebrate your GitHub activity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Lessons Learned:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Using GitHub’s API effectively.&lt;/li&gt;
&lt;li&gt;Structuring data and displaying it in meaningful ways.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can check out the project here: &lt;a href="https://github.com/KAwasthi2889/GitHub_User_Activity" rel="noopener noreferrer"&gt;GitHub User Activity Tracker&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reflections and Future Plans&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From understanding go's core concepts to applying them in projects, it was a great experience. These projects not only helped solidify my knowledge on go but also taught me how to build &amp;amp; read APIs.&lt;/p&gt;

&lt;p&gt;What's next: I am building a Personal Blogging Platform that will store data on a Postgres database running on a docker container. This project will have an interactive TUI.&lt;/p&gt;

&lt;p&gt;I’d love to hear your feedback on these projects! If you’re learning Go or working on similar tools, let’s &lt;a href="//www.linkedin.com/in/kawasthi2889"&gt;connect&lt;/a&gt; and share insights. 🚀&lt;/p&gt;

</description>
      <category>go</category>
      <category>learning</category>
      <category>api</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
