<?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: Deepak Mardi</title>
    <description>The latest articles on DEV Community by Deepak Mardi (@deepakmardii).</description>
    <link>https://dev.to/deepakmardii</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%2F1325895%2F44d29436-0d37-4fea-92ec-256eb9e04ca1.jpg</url>
      <title>DEV Community: Deepak Mardi</title>
      <link>https://dev.to/deepakmardii</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/deepakmardii"/>
    <language>en</language>
    <item>
      <title>Mastering Pagination: From Beginner to Pro</title>
      <dc:creator>Deepak Mardi</dc:creator>
      <pubDate>Sat, 09 May 2026 07:15:55 +0000</pubDate>
      <link>https://dev.to/deepakmardii/mastering-pagination-from-beginner-to-pro-55ja</link>
      <guid>https://dev.to/deepakmardii/mastering-pagination-from-beginner-to-pro-55ja</guid>
      <description>&lt;p&gt;If you've ever built an app that shows a list of things—whether it's blog posts, products, or users—you've likely hit a wall: as your list grows, your app gets slower. Eventually, it might even crash.&lt;/p&gt;

&lt;p&gt;The solution to this problem is &lt;strong&gt;Pagination&lt;/strong&gt;. To truly master it, we need to look at it through three lenses: &lt;strong&gt;Why&lt;/strong&gt; we need it, &lt;strong&gt;What&lt;/strong&gt; it actually is, and &lt;strong&gt;How&lt;/strong&gt; we implement it.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;You can also read other blogs on my &lt;a href="https://blog.iamdeepakmardi.xyz" rel="noopener noreferrer"&gt;website&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1. WHY: The Problem of "Too Much Data"
&lt;/h2&gt;

&lt;p&gt;Before we learn how to build pagination, we have to understand the disaster that happens without it. Imagine you have a database with 100,000 users. If you try to fetch all of them at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;The Server Chokes:&lt;/strong&gt; Your database has to read 100,000 rows from the disk, package them into a massive JSON file, and send it over the internet. This takes a lot of time and CPU power.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The Internet Connection Struggles:&lt;/strong&gt; Sending a 50MB file to a user on a mobile phone will take forever. The user will see a loading spinner (or a blank screen) and likely leave your site.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The Browser Crashes:&lt;/strong&gt; Once the phone finally receives that 50MB file, it has to turn that data into 100,000 rows of HTML. Most mobile browsers will run out of memory and simply crash the tab.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;In short: We use pagination for speed, stability, and to save on server costs.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. WHAT: The Definition of Pagination
&lt;/h2&gt;

&lt;p&gt;Pagination is the process of &lt;strong&gt;dividing a large dataset into smaller, manageable chunks (pages)&lt;/strong&gt; and providing a way for the user to navigate through them.&lt;/p&gt;

&lt;p&gt;Instead of asking for "all users," you ask for "the first 20 users." When the user is ready for more, you fetch the "next 20 users."&lt;/p&gt;

&lt;p&gt;Think of it like a &lt;strong&gt;book&lt;/strong&gt;. If a book was just one long, continuous scroll of paper, it would be impossible to handle. By breaking it into pages, the author makes the content "consumable." You can read a little, stop, and come back later to exactly where you were.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. HOW: The Three Main Strategies
&lt;/h2&gt;

&lt;p&gt;There isn't just one way to "paginate." Depending on your app's needs, you will choose one of these three implementation methods.&lt;/p&gt;

&lt;h3&gt;
  
  
  Method A: Offset Pagination (The \"Page Number\" Approach)
&lt;/h3&gt;

&lt;p&gt;This is the most common \"How.\" You tell the database to skip a certain number of items and then take a specific amount.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;The Logic:&lt;/strong&gt; \"Skip 40 items, and give me the next 20.\" (This would be Page 3).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Best For:&lt;/strong&gt; Simple apps where you need to jump to a specific page (e.g., \"Go to Page 10\").&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Code (SQL):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Fetch 20 items for Page 3&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="k"&gt;OFFSET&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Method B: Cursor Pagination (The \"Bookmark\" Approach)
&lt;/h3&gt;

&lt;p&gt;Instead of counting how many items to skip, you use a specific item as a pointer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;The Logic:&lt;/strong&gt; \"Give me the next 20 items that come &lt;em&gt;after&lt;/em&gt; the item with ID #505.\"&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Best For:&lt;/strong&gt; Large, constantly changing datasets (like a Facebook or Twitter feed).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Code (SQL):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Fetch the next 20 items after a specific ID&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;505&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Method C: Infinite Scroll (The \"Automatic\" Approach)
&lt;/h3&gt;

&lt;p&gt;This is actually a frontend \"How\" that usually uses Cursor Pagination in the background.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;The Logic:&lt;/strong&gt; As the user's screen reaches the bottom of the list, the app automatically triggers a request for the \"next page.\"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Code (JavaScript):&lt;/strong&gt;&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="c1"&gt;// Simple logic to fetch more data when scrolling&lt;/span&gt;
&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onscroll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHeight&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollY&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;offsetHeight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// We hit the bottom! &lt;/span&gt;
    &lt;span class="c1"&gt;// Use the last item's ID as our 'cursor'&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lastId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.item:last-child&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;dataset&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="nf"&gt;fetchMoreData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lastId&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;h2&gt;
  
  
  Summary Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Why use it?&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;How is it built?&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Offset&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simplicity&lt;/td&gt;
&lt;td&gt;Page Numbers&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;LIMIT&lt;/code&gt; and &lt;code&gt;OFFSET&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;Bookmarks&lt;/td&gt;
&lt;td&gt;&lt;code&gt;WHERE id &amp;gt; last_seen_id&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Infinite Scroll&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Engagement&lt;/td&gt;
&lt;td&gt;Continuous Feed&lt;/td&gt;
&lt;td&gt;Auto-fetching more data&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>architecture</category>
      <category>api</category>
    </item>
    <item>
      <title>Introducing Habitly: A Modern Habit Tracker to Help You Build Lasting Routines</title>
      <dc:creator>Deepak Mardi</dc:creator>
      <pubDate>Tue, 09 Sep 2025 05:54:12 +0000</pubDate>
      <link>https://dev.to/deepakmardii/introducing-habitly-a-modern-habit-tracker-to-help-you-build-lasting-routines-42ca</link>
      <guid>https://dev.to/deepakmardii/introducing-habitly-a-modern-habit-tracker-to-help-you-build-lasting-routines-42ca</guid>
      <description>&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%2Fkohaw7f4mkvxcs3vvdmv.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%2Fkohaw7f4mkvxcs3vvdmv.png" alt=" " width="800" height="393"&gt;&lt;/a&gt;&lt;br&gt;
Struggling to build and maintain new habits? You're not alone. The digital landscape is full of tools, but many are either overly complex, locked behind a paywall, or lack the features you truly need to stay motivated.&lt;/p&gt;

&lt;p&gt;That's why I built &lt;strong&gt;Habitly&lt;/strong&gt;, a modern habit tracking application designed to be simple, beautiful, and effective.&lt;/p&gt;

&lt;p&gt;Habitly isn't just another app; it's a tool built to help you achieve your goals by focusing on core functionality and a clean, intuitive user experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✨ Key Features that Make Habitly Stand Out
&lt;/h3&gt;

&lt;p&gt;From the start, the goal was to create a tool I would genuinely want to use every day. Habitly's features are centered around a straightforward philosophy: make habit tracking effortless and insightful.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Daily Tracking&lt;/strong&gt;: Mark habits as complete with a single click. No convoluted menus or extra steps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streak Tracking&lt;/strong&gt;: Automatically see your progress with consecutive day counts, a powerful motivator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progress Visualization&lt;/strong&gt;: Beautiful heatmaps give you a clear, at-a-glance view of your habit history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analytics Dashboard&lt;/strong&gt;: Get a comprehensive overview of your habit performance and identify trends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure User Authentication&lt;/strong&gt;: Log in with Google OAuth, so you can start tracking in seconds.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛠️ The Technology Behind Habitly
&lt;/h3&gt;

&lt;p&gt;For the developers out there, here's a look at the tech stack that powers Habitly. The project is built on modern, widely-used technologies, making it easy to understand and work with.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Next.js 14, React, and a clean, responsive design built with Tailwind CSS and shadcn/ui.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Next.js API Routes for fast and efficient data handling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: PostgreSQL, managed with Prisma ORM for reliable and type-safe database access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt;: NextAuth.js provides a secure and easy-to-implement authentication system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Charts&lt;/strong&gt;: Progress heatmaps and other data visualizations are powered by Recharts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 Get Started and Connect
&lt;/h3&gt;

&lt;p&gt;If you're interested in using Habitly, you can check out the &lt;a href="https://github.com/deepakmardii/habitly" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt; or &lt;a href="https://habitly-tau.vercel.app" rel="noopener noreferrer"&gt;Website&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explore the project: Learn about the features and future plans.&lt;/li&gt;
&lt;li&gt;Report issues: Found a bug? Have an idea for a new feature? Let me know!&lt;/li&gt;
&lt;li&gt;Connect with me: I have a lot of ideas for the future, including reminders, advanced analytics, and more.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Habitly is a passion project, and I'm excited to see where it goes. I hope it helps you build the lasting habits you're looking for.&lt;br&gt;
If you have any questions or want to discuss the project, feel free to leave a comment or open an issue on GitHub. Happy tracking!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building FeedbackSense: How I Solved the Customer Feedback Analysis Problem with AI</title>
      <dc:creator>Deepak Mardi</dc:creator>
      <pubDate>Mon, 07 Jul 2025 08:25:18 +0000</pubDate>
      <link>https://dev.to/deepakmardii/building-feedbacksense-how-i-solved-the-customer-feedback-analysis-problem-with-ai-1e67</link>
      <guid>https://dev.to/deepakmardii/building-feedbacksense-how-i-solved-the-customer-feedback-analysis-problem-with-ai-1e67</guid>
      <description>&lt;h2&gt;
  
  
  &lt;em&gt;Building FeedbackSense: How I Solved the Customer Feedback Analysis Problem with AI&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Problem That Sparked Everything&lt;/strong&gt;&lt;br&gt;
During my conversations with several small business owners, I noticed a recurring frustration. Sarah, who runs an e-commerce store, told me she spends hours every week manually reading through customer reviews, support emails, and survey responses scattered across different platforms. "I know there are insights in all this feedback," she said, "but I just don't have the time to analyze it properly."&lt;/p&gt;

&lt;p&gt;This resonated with me because it's a problem that affects countless businesses. Customer feedback arrives through multiple channels - email support tickets, Google reviews, social media comments, survey responses, and direct messages. While this feedback contains valuable insights about customer satisfaction, product issues, and improvement opportunities, most businesses lack the tools to analyze it efficiently at scale.&lt;/p&gt;

&lt;p&gt;The traditional approach involves manually reading through hundreds of responses, trying to identify patterns, and categorizing feedback by sentiment or topic. This process is not only time-consuming but also prone to human error and bias. Important insights often get lost in the noise, and by the time patterns are identified, the opportunity to act on them may have passed.&lt;br&gt;
I realized there was an opportunity to build a solution that could automate this analysis process using modern AI technology, while still maintaining the human touch that businesses need to understand their customers deeply.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Solution: FeedbackSense&lt;/strong&gt;&lt;br&gt;
I decided to build FeedbackSense, an AI-powered customer feedback analysis platform that addresses these pain points head-on. The core idea was simple: create a centralized platform where businesses can upload their feedback data and receive instant, actionable insights through AI analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features That Make a Difference&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Smart Data Import and Column Mapping&lt;/strong&gt;&lt;br&gt;
One of the first challenges I tackled was data flexibility. Real-world CSV files come in all shapes and sizes, with different column names and structures. Instead of forcing users to reformat their data, I built a Smart Column Mapping system that automatically detects CSV structure and lets users map their existing columns to feedback fields. Only the main feedback text is required, while fields like source, category, and date can be optional or auto-generated by AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intelligent Batch Processing&lt;/strong&gt;&lt;br&gt;
To balance performance with cost-effectiveness, I implemented a batch processing system that analyzes 15 feedback items at a time, with a maximum limit of 100 rows per upload. This approach keeps AI processing costs reasonable while maintaining fast response times of 1-2 seconds per batch. The system provides real-time progress updates, so users always know what's happening behind the scenes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comprehensive AI Analysis&lt;/strong&gt;&lt;br&gt;
Each piece of feedback goes through multiple layers of AI analysis using Google's Gemini AI. The system performs sentiment classification to determine whether feedback is positive, negative, or neutral, and automatically categorizes content by topic. This dual approach gives businesses both emotional context and topical insights from their customer data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visual Dashboard and Reporting&lt;/strong&gt;&lt;br&gt;
The results are presented through an intuitive dashboard that shows sentiment distribution, trending topics, and key performance indicators. Users can drill down into individual feedback items or view aggregate trends over time. The system also generates comprehensive AI-powered reports that provide actionable recommendations based on the analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technical Decisions That Shaped the Platform&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Why Next.js for the Frontend&lt;/strong&gt;&lt;br&gt;
I chose Next.js because it provides excellent performance out of the box with server-side rendering, built-in API routes, and excellent developer experience. The framework's file-based routing and API integration made it easy to build both the user interface and backend endpoints in a cohesive manner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Supabase as the Backend Foundation&lt;/strong&gt;&lt;br&gt;
Rather than building custom backend infrastructure, I opted for Supabase as my backend-as-a-service platform. This decision gave me access to PostgreSQL database, authentication, real-time subscriptions, and storage without the complexity of managing servers. Supabase's real-time features were particularly valuable for showing live updates during the batch processing workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini AI for Natural Language Processing&lt;/strong&gt;&lt;br&gt;
For the AI analysis component, I integrated Google's Gemini AI, which provides excellent performance for sentiment analysis and text categorization tasks. I also built the system to be compatible with OpenAI's API, providing flexibility for future model switching based on performance or cost requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS for Deployment and Scalability&lt;/strong&gt;&lt;br&gt;
I deployed the application on AWS to ensure reliability and scalability. The cloud infrastructure provides the performance needed for real-time processing while maintaining cost efficiency for a growing user base.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshots and User Journey&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Screenshot 1: Landing Page&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%2Fhkjz6q56daf4lncwsu3b.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%2Fhkjz6q56daf4lncwsu3b.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Screenshot 2: Project Creation&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%2F4l2rm4fajudziw2fkzih.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%2F4l2rm4fajudziw2fkzih.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Screenshot 3: CSV Upload Interface&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%2Flbd6xx6wpnu7j6eyogh9.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%2Flbd6xx6wpnu7j6eyogh9.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Screenshot 4: Smart Column Mapping&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%2F2jf6j0ufqqvblfduk9tp.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%2F2jf6j0ufqqvblfduk9tp.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Screenshot 5: Batch Processing in Action&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%2Fbtaikjktyflibu67raoz.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%2Fbtaikjktyflibu67raoz.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Screenshot 6: All Feedback View&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%2Fqitpqj24enoivt66rmwd.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%2Fqitpqj24enoivt66rmwd.png" alt=" " width="800" height="437"&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%2Fghfyqva7h6li745zd91n.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%2Fghfyqva7h6li745zd91n.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Screenshot 7: Dashboard Analytics&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%2Fs4lny95j53bffdk5tpf9.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%2Fs4lny95j53bffdk5tpf9.png" alt=" " width="800" height="437"&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%2Fjiu5dobngw5je5hdnzff.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%2Fjiu5dobngw5je5hdnzff.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Screenshot 8: AI-Generated Report&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%2Fxspmdd13jt2agby2ueb7.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%2Fxspmdd13jt2agby2ueb7.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Development Journey&lt;/strong&gt;&lt;br&gt;
Building FeedbackSense taught me valuable lessons about balancing user experience with technical complexity. The most challenging aspect was designing the batch processing system to be both efficient and user-friendly. I went through several iterations before landing on the current approach that processes 15 items per batch with clear progress indicators.&lt;/p&gt;

&lt;p&gt;The Smart Column Mapping feature was another interesting challenge. I had to anticipate various CSV formats while keeping the interface intuitive. The solution involved building flexible parsing logic that could handle different column names, data types, and missing values gracefully.&lt;/p&gt;

&lt;p&gt;Integrating AI analysis required careful consideration of rate limits, error handling, and cost optimization. I implemented retry logic for failed requests and built the system to gracefully handle API failures without losing user data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-World Impact&lt;/strong&gt;&lt;br&gt;
The platform successfully demonstrates how modern web technologies can solve real business problems. Users can process 100 feedback items in under 2 minutes with over 95% accuracy in sentiment detection. The automated categorization and reporting features save hours of manual analysis work, allowing business owners to focus on acting on insights rather than finding them.&lt;/p&gt;

&lt;p&gt;The batch processing approach keeps AI costs reasonable while maintaining high performance, making the solution accessible to small and medium businesses that need these insights most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's Next&lt;/strong&gt;&lt;br&gt;
This project opened my eyes to the potential of AI-powered business tools. Future enhancements I'm considering include real-time collaboration features for teams, advanced analytics with trend prediction, and mobile application development for on-the-go insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  The experience of building FeedbackSense from problem identification to deployment has been incredibly rewarding. It reinforced my belief that the best software solutions come from understanding real user problems and applying technology thoughtfully to solve them.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Try It Yourself&lt;/strong&gt;&lt;br&gt;
🚀 Live Demo: &lt;a href="http://13.232.19.114/" rel="noopener noreferrer"&gt;FeedbackSense Live Application&lt;/a&gt;&lt;br&gt;
💻 Video Demo: &lt;a href="https://drive.google.com/file/d/1iAqtWKwXYOCIv8sHzQD8C_ofx4fU9C6X/view?usp=drive_link" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to explore feedbacksense, try the live demo, or reach out if you have any questions about the implementation.&lt;/p&gt;

&lt;p&gt;Built with Next.js, Supabase, Gemini AI, and deployed on AWS. This project represents my approach to full-stack development, AI integration, and solving real-world business problems through technology.&lt;/p&gt;

&lt;p&gt;I'd love to hear your thoughts on this project or discuss how similar solutions could address other business challenges. You can reach me on LinkedIn or Twitter for any questions or collaboration opportunities.&lt;/p&gt;

&lt;p&gt;This case study is part of my portfolio showcasing full-stack development skills and practical problem-solving with modern web technologies.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>javascript</category>
      <category>career</category>
    </item>
    <item>
      <title>What is your goto tailwind UI Component library for landing pages?</title>
      <dc:creator>Deepak Mardi</dc:creator>
      <pubDate>Wed, 06 Mar 2024 12:31:40 +0000</pubDate>
      <link>https://dev.to/deepakmardii/what-is-your-goto-tailwind-ui-component-library-for-landing-pages-57bp</link>
      <guid>https://dev.to/deepakmardii/what-is-your-goto-tailwind-ui-component-library-for-landing-pages-57bp</guid>
      <description></description>
      <category>webdev</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
