<?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 Paswan</title>
    <description>The latest articles on DEV Community by Deepak Paswan (@dpkpaswan).</description>
    <link>https://dev.to/dpkpaswan</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3955839%2F7b918ddd-63ec-4115-9608-31eaeb89f755.png</url>
      <title>DEV Community: Deepak Paswan</title>
      <link>https://dev.to/dpkpaswan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dpkpaswan"/>
    <language>en</language>
    <item>
      <title>How I Built a Sales Agent That Actually Remembers Your Prospects</title>
      <dc:creator>Deepak Paswan</dc:creator>
      <pubDate>Sat, 04 Jul 2026 12:40:41 +0000</pubDate>
      <link>https://dev.to/dpkpaswan/how-i-built-a-sales-agent-that-actually-remembers-your-prospects-443e</link>
      <guid>https://dev.to/dpkpaswan/how-i-built-a-sales-agent-that-actually-remembers-your-prospects-443e</guid>
      <description>&lt;p&gt;Copy this entire block and paste it into Dev.to:&lt;/p&gt;




&lt;p&gt;Every sales tool I've used has the same problem: it forgets everything the moment you close the tab.&lt;/p&gt;

&lt;p&gt;Your CRM has notes, sure. But your AI assistant? Blank slate every single conversation. Ask it about a prospect you've been working for three months and it treats them like a stranger.&lt;/p&gt;

&lt;p&gt;I built something different. A sales agent that remembers every objection, every discussion, every commitment — across sessions, across restarts, across days.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;

&lt;p&gt;Deal Intelligence Agent is a sales assistant built on three layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hindsight&lt;/strong&gt; for persistent memory across sessions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cascadeflow&lt;/strong&gt; for intelligent model routing and cost control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI + React&lt;/strong&gt; for the backend and UI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A sales rep opens a prospect, has a conversation, ends the session. Next day, different server instance, they ask "what objections has Acme raised?" — the agent recalls exactly what was discussed, including specific dollar amounts and concerns raised days ago.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Memory Problem
&lt;/h2&gt;

&lt;p&gt;Most AI agents store conversation history in memory. That works fine until the server restarts, the session ends, or you switch devices. Then everything is gone.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hindsight.vectorize.io/" rel="noopener noreferrer"&gt;Hindsight&lt;/a&gt; solves this with a persistent memory bank per entity. Each prospect gets their own bank:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_bank_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prospect_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prospect-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;prospect_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every exchange gets retained after each turn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;bank_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bank_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;] [&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;] &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before each response, the agent recalls relevant context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;results_raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bank_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bank_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results_raw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;results_raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;memories&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results_raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;max_results&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key lesson: Hindsight returns a &lt;code&gt;RecallResult&lt;/code&gt; object, not a list or dict. I spent two hours debugging because my parser was doing &lt;code&gt;isinstance(results, list)&lt;/code&gt; checks that always failed silently. Always print the raw response shape before writing your parser.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Before and After
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Session 1 — no prior context:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rep: "They objected to the $50K price"
Agent: "I don't have prior context on this prospect.
        Can you tell me more about their concerns?"

memory_source: none
memories_recalled: 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Session 2 — after server restart, completely new session:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rep: "What objections has Acme raised?"
Agent: "Acme raised a price objection of $50,000 in
        our last discussion..."

memory_source: hindsight
memories_recalled: 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That delta — generic to specific — is the entire value proposition. Without &lt;a href="https://vectorize.io/what-is-agent-memory" rel="noopener noreferrer"&gt;Hindsight's agent memory&lt;/a&gt;, session 2 is identical to session 1. With it, the agent compounds knowledge over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intelligent Routing With cascadeflow
&lt;/h2&gt;

&lt;p&gt;Running every query through a 70B model is expensive and unnecessary.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/lemony-ai/cascadeflow" rel="noopener noreferrer"&gt;cascadeflow&lt;/a&gt; handles routing automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;route_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;route_query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;complexity_hint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_estimate_complexity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Simple queries → &lt;code&gt;llama-3.1-8b-instant&lt;/code&gt; at &lt;strong&gt;$0.00005 per call&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Complex analysis → &lt;code&gt;llama-3.3-70b-versatile&lt;/code&gt; at &lt;strong&gt;$0.00032 per call&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every decision is logged — model selected, cost, complexity, reasoning. Most sales conversations are simple status checks. Only strategic analysis needs the expensive model. Across 100 queries the cost difference is significant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Session Summaries via Hindsight reflect()
&lt;/h2&gt;

&lt;p&gt;After each conversation, the agent synthesizes everything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reflect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;bank_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bank_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize key points, objections raised, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
          &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deal stage, and recommended next action.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output is a structured summary — discussion points, prospect sentiment, objections, and a specific next action. This becomes the handoff document between sessions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Things I'd Do Differently
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Test your recall parser against the actual response object on day one.&lt;/strong&gt; Don't assume the shape. Print the raw response first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add a health check endpoint.&lt;/strong&gt; I had Hindsight silently falling back to local memory for hours without knowing. A simple retain-then-recall test at startup would have caught this immediately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Classify intent instead of counting words.&lt;/strong&gt; My complexity heuristic uses word count. Classifying the request type — question vs analysis vs drafting — is more reliable.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The current version handles single-rep conversations. The obvious next step is multi-rep shared memory — where a prospect's history is visible across the entire sales team.&lt;/p&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/dpkpaswan/deal-intelligence-agent" rel="noopener noreferrer"&gt;github.com/dpkpaswan/deal-intelligence-agent&lt;/a&gt;&lt;br&gt;
Hindsight docs: &lt;a href="https://hindsight.vectorize.io/" rel="noopener noreferrer"&gt;hindsight.vectorize.io&lt;/a&gt;&lt;br&gt;
cascadeflow docs: &lt;a href="https://docs.cascadeflow.ai/" rel="noopener noreferrer"&gt;docs.cascadeflow.ai&lt;/a&gt;&lt;/p&gt;




</description>
      <category>ai</category>
      <category>python</category>
      <category>machinelearning</category>
      <category>webdev</category>
    </item>
    <item>
      <title>From Abandoned Prototype to AI-Powered Google Form Platform</title>
      <dc:creator>Deepak Paswan</dc:creator>
      <pubDate>Thu, 28 May 2026 06:05:13 +0000</pubDate>
      <link>https://dev.to/dpkpaswan/from-abandoned-prototype-to-ai-powered-google-form-platform-cgm</link>
      <guid>https://dev.to/dpkpaswan/from-abandoned-prototype-to-ai-powered-google-form-platform-cgm</guid>
      <description>&lt;h1&gt;
  
  
  I Revived My AI-Powered Google Form Generator Using GitHub Copilot
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I revived and completed my unfinished project: &lt;strong&gt;AI-Powered Google Form Generator&lt;/strong&gt; — a full-stack web application that creates real Google Forms from natural language prompts using Google Gemini AI.&lt;/p&gt;

&lt;p&gt;The original idea started as a small experiment:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Can AI automatically generate a complete Google Form from a simple text description?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Initially, the project only supported basic prompt-to-form generation. It worked as a proof of concept, but the user experience was incomplete, the backend structure was messy, and several important features were missing. Eventually, I stopped working on it.&lt;/p&gt;

&lt;p&gt;For the GitHub Finish-Up-A-Thon Challenge, I decided to revisit the project and properly finish it by transforming it from a simple AI demo into a more complete workflow platform.&lt;/p&gt;

&lt;p&gt;The application now supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔐 Google OAuth authentication&lt;/li&gt;
&lt;li&gt;🧠 AI-powered form generation using Google Gemini&lt;/li&gt;
&lt;li&gt;📄 PDF and DOCX document-to-form generation&lt;/li&gt;
&lt;li&gt;🖼️ Image-to-form generation&lt;/li&gt;
&lt;li&gt;✏️ Editable generated questions&lt;/li&gt;
&lt;li&gt;📊 Form analytics dashboard&lt;/li&gt;
&lt;li&gt;📂 User form management dashboard&lt;/li&gt;
&lt;li&gt;📝 Pre-built form templates&lt;/li&gt;
&lt;li&gt;🛡️ Secure token handling and validation&lt;/li&gt;
&lt;li&gt;🐳 Docker-based deployment support&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h4&gt;
  
  
  Frontend
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;React 18&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;li&gt;TailwindCSS&lt;/li&gt;
&lt;li&gt;Redux Toolkit&lt;/li&gt;
&lt;li&gt;Framer Motion&lt;/li&gt;
&lt;li&gt;Recharts + D3.js&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Backend
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Express.js&lt;/li&gt;
&lt;li&gt;Google Gemini API&lt;/li&gt;
&lt;li&gt;Google Forms API&lt;/li&gt;
&lt;li&gt;Supabase PostgreSQL&lt;/li&gt;
&lt;li&gt;Zod validation&lt;/li&gt;
&lt;li&gt;JWT Authentication&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  GitHub Repository
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/dpkpaswan/AI-powered-Google-Form-Generator" rel="noopener noreferrer"&gt;https://github.com/dpkpaswan/AI-powered-Google-Form-Generator&lt;/a&gt;&lt;/p&gt;




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

&lt;h3&gt;
  
  
  🎥 Video Walkthrough
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://youtu.be/b_d_2QhdoRU" rel="noopener noreferrer"&gt;https://youtu.be/b_d_2QhdoRU&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Application Workflow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Sign in using Google OAuth&lt;/li&gt;
&lt;li&gt;Enter a natural language prompt&lt;/li&gt;
&lt;li&gt;AI generates structured form questions&lt;/li&gt;
&lt;li&gt;Edit or improve generated questions&lt;/li&gt;
&lt;li&gt;Publish directly to Google Forms&lt;/li&gt;
&lt;li&gt;Manage forms and view analytics&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Example Prompt
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“Create a college symposium registration form with participant details, department selection, workshop preferences, and feedback questions.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&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%2Fcn0dfkl78t2pcz5ivyi7.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%2Fcn0dfkl78t2pcz5ivyi7.png" alt=" " width="798" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Repository
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/dpkpaswan/AI-powered-Google-Form-Generator" rel="noopener noreferrer"&gt;https://github.com/dpkpaswan/AI-powered-Google-Form-Generator&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;p&gt;When I first started this project, it was mainly a proof of concept focused on AI-generated forms.&lt;/p&gt;

&lt;p&gt;The original version had multiple issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Weak UI and UX&lt;/li&gt;
&lt;li&gt;No form management system&lt;/li&gt;
&lt;li&gt;No analytics support&lt;/li&gt;
&lt;li&gt;Limited backend structure&lt;/li&gt;
&lt;li&gt;Minimal validation&lt;/li&gt;
&lt;li&gt;No document parsing&lt;/li&gt;
&lt;li&gt;No templates&lt;/li&gt;
&lt;li&gt;No deployment setup&lt;/li&gt;
&lt;li&gt;Difficult-to-maintain codebase&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Over time, I kept adding ideas without properly finishing the core workflow. The project slowly became harder to maintain and eventually got abandoned.&lt;/p&gt;

&lt;p&gt;For this challenge, I focused less on adding random new features and more on improving usability, architecture, reliability, and overall product quality.&lt;/p&gt;

&lt;p&gt;Major improvements I made during the revival process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rebuilt the backend using controllers/services architecture&lt;/li&gt;
&lt;li&gt;Added secure Google OAuth integration&lt;/li&gt;
&lt;li&gt;Integrated Supabase for persistent storage&lt;/li&gt;
&lt;li&gt;Added PDF and DOCX parsing support&lt;/li&gt;
&lt;li&gt;Added image-based form generation&lt;/li&gt;
&lt;li&gt;Added editable forms workflow&lt;/li&gt;
&lt;li&gt;Built analytics dashboards using charts&lt;/li&gt;
&lt;li&gt;Improved validation and error handling&lt;/li&gt;
&lt;li&gt;Added reusable templates&lt;/li&gt;
&lt;li&gt;Added Docker deployment support&lt;/li&gt;
&lt;li&gt;Improved overall frontend design and responsiveness&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One important lesson from this process was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Finishing and polishing a project is much harder than starting one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The biggest improvements were not flashy AI features — they were stability, usability, and better system structure.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot helped me significantly during the rebuilding and cleanup process.&lt;/p&gt;

&lt;p&gt;I mainly used Copilot for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refactoring backend services&lt;/li&gt;
&lt;li&gt;Creating API boilerplate&lt;/li&gt;
&lt;li&gt;Improving Express routes and middleware&lt;/li&gt;
&lt;li&gt;Writing reusable utility functions&lt;/li&gt;
&lt;li&gt;Generating validation schemas&lt;/li&gt;
&lt;li&gt;Improving React component structure&lt;/li&gt;
&lt;li&gt;Debugging async logic&lt;/li&gt;
&lt;li&gt;Speeding up repetitive frontend tasks&lt;/li&gt;
&lt;li&gt;Improving documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of the most useful parts was backend refactoring. The earlier version had tightly coupled logic, and Copilot helped accelerate the process of separating business logic into cleaner service layers.&lt;/p&gt;

&lt;p&gt;I also used Copilot while improving UI components and simplifying repetitive coding tasks during frontend cleanup.&lt;/p&gt;

&lt;p&gt;Instead of treating Copilot as a replacement for development, I used it as a productivity tool to speed up implementation and refactoring while still making the technical decisions manually.&lt;/p&gt;




&lt;h2&gt;
  
  
  Challenges Faced
&lt;/h2&gt;

&lt;p&gt;Some of the biggest technical challenges were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Managing Google OAuth token handling securely&lt;/li&gt;
&lt;li&gt;Integrating the Google Forms API reliably&lt;/li&gt;
&lt;li&gt;Structuring AI-generated question formats consistently&lt;/li&gt;
&lt;li&gt;Parsing uploaded documents correctly&lt;/li&gt;
&lt;li&gt;Maintaining clean architecture while expanding features&lt;/li&gt;
&lt;li&gt;Handling async workflows between AI generation and Google APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also realized that overengineering can easily destroy project momentum. At one point, I was adding too many ideas without stabilizing the core product experience.&lt;/p&gt;

&lt;p&gt;This challenge helped me focus on actually finishing the application.&lt;/p&gt;




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

&lt;p&gt;This challenge pushed me to revisit an abandoned project and finally complete it properly.&lt;/p&gt;

&lt;p&gt;The biggest takeaway for me was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A polished and usable product matters more than endlessly adding features.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are still future improvements I want to make, but this challenge helped me transform an unfinished prototype into a much more stable and production-ready application.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;br&gt;
&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

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

&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
    </item>
  </channel>
</rss>
