<?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: Vishal Kumar</title>
    <description>The latest articles on DEV Community by Vishal Kumar (@vvisshuuu2500).</description>
    <link>https://dev.to/vvisshuuu2500</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%2F3780795%2F99f20cc8-06b4-4b26-bfed-c7fe206c501b.png</url>
      <title>DEV Community: Vishal Kumar</title>
      <link>https://dev.to/vvisshuuu2500</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vvisshuuu2500"/>
    <language>en</language>
    <item>
      <title>I Built StudyMate for a Friend Who Was Tired of Studying From Scattered PDFs</title>
      <dc:creator>Vishal Kumar</dc:creator>
      <pubDate>Sun, 04 Oct 2026 16:40:31 +0000</pubDate>
      <link>https://dev.to/vvisshuuu2500/i-built-studymate-for-a-friend-who-was-tired-of-studying-from-scattered-pdfs-1mmg</link>
      <guid>https://dev.to/vvisshuuu2500/i-built-studymate-for-a-friend-who-was-tired-of-studying-from-scattered-pdfs-1mmg</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;StudyMate&lt;/strong&gt;, a grounded AI study companion for a friend who was struggling with scattered PDFs, notes, and revision material.&lt;/p&gt;

&lt;p&gt;The problem was simple: studying required constantly switching between PDFs, searching for specific topics, asking questions in separate AI tools, creating revision notes, and figuring out what was actually remembered.&lt;/p&gt;

&lt;p&gt;StudyMate brings this workflow into one focused study space.&lt;/p&gt;

&lt;p&gt;Its core loop is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn → Ask → Practice → Identify Weakness → Revise → Improve&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Students can upload their study PDFs and use them to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask questions grounded in their own study material&lt;/li&gt;
&lt;li&gt;Generate revision-ready summaries&lt;/li&gt;
&lt;li&gt;Create quizzes with different difficulty levels&lt;/li&gt;
&lt;li&gt;Practice with AI-generated flashcards&lt;/li&gt;
&lt;li&gt;Build a study plan based on their exam date and available study time&lt;/li&gt;
&lt;li&gt;Track their study progress&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most important design rule is &lt;strong&gt;grounding&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;StudyMate should not pretend to know something that is not present in the student's uploaded material. If the required information cannot be found, it responds:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I couldn't find this information in your uploaded study material."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It also preserves source and page information so that answers can be traced back to the student's actual notes instead of using fabricated citations.&lt;/p&gt;

&lt;p&gt;I built StudyMate specifically for a real student workflow rather than creating another general-purpose AI chatbot.&lt;/p&gt;

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

&lt;p&gt;Try StudyMate here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://studymate-frontend-hbi2.onrender.com" rel="noopener noreferrer"&gt;https://studymate-frontend-hbi2.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can upload a study PDF, select your study material, ask grounded questions, generate summaries, create quizzes, practice flashcards, and build a personalized study plan.&lt;/p&gt;

&lt;p&gt;The live demo is deployed on Render so anyone can open it and try the application directly in their browser.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The current deployment is running on Render's free infrastructure, so uploaded study data should not be considered permanent storage. The live deployment is primarily intended for demonstrating and testing the application.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;The complete source code for StudyMate is available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/codewithvishuuu/studymate" rel="noopener noreferrer"&gt;https://github.com/codewithvishuuu/studymate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is open source and released under the &lt;strong&gt;MIT License&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The repository contains the complete React frontend, FastAPI backend, AI/RAG pipeline, document processing, database logic, tests, and deployment configuration.&lt;/p&gt;

&lt;p&gt;The project was built as a full-stack application rather than a frontend-only AI demo, with the backend handling AI orchestration, retrieval, document processing, and application logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;StudyMate is built as a full-stack AI application using &lt;strong&gt;React, TypeScript, Vite, Tailwind CSS, Python, FastAPI, ChromaDB, and Gemma&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The core AI workflow is based on &lt;strong&gt;Retrieval-Augmented Generation (RAG)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When a student uploads a PDF, StudyMate processes it through this pipeline:&lt;/p&gt;

&lt;p&gt;PDF&lt;br&gt;
 ↓&lt;br&gt;
Text Extraction&lt;br&gt;
 ↓&lt;br&gt;
Cleaning&lt;br&gt;
 ↓&lt;br&gt;
Page-Aware Chunking&lt;br&gt;
 ↓&lt;br&gt;
Embeddings&lt;br&gt;
 ↓&lt;br&gt;
ChromaDB&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;For StudyMate, open innovation means having more flexibility and control over the AI layer instead of building the entire product around a closed, black-box system.&lt;/p&gt;

&lt;p&gt;I chose &lt;strong&gt;Gemma&lt;/strong&gt; as the generation model because it gives me an open-weight model that I can experiment with as the project evolves.&lt;/p&gt;

&lt;p&gt;With this approach, I can explore different possibilities in the future, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Different Gemma variants&lt;/li&gt;
&lt;li&gt;Local inference&lt;/li&gt;
&lt;li&gt;Different retrieval strategies&lt;/li&gt;
&lt;li&gt;Different embedding models&lt;/li&gt;
&lt;li&gt;Fine-tuning&lt;/li&gt;
&lt;li&gt;Different deployment environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This flexibility is important for StudyMate because the AI model is only one part of the system. The document processing, retrieval pipeline, source attribution, and study features can continue evolving independently.&lt;/p&gt;

&lt;p&gt;The project also helped me understand that open innovation is not only about using an open model. It is about having the freedom to experiment, understand the technology, and build a system that can evolve with the needs of its users.&lt;/p&gt;

&lt;p&gt;For a study application, that flexibility can eventually mean better control over cost, privacy, deployment, and model choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building for a Friend
&lt;/h2&gt;

&lt;p&gt;I built StudyMate around a real problem faced by a friend: studying from scattered PDFs and notes was taking more effort than it should.&lt;/p&gt;

&lt;p&gt;Instead of starting with the question, "What AI feature can I build?", I started with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What would actually make studying easier for my friend?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That changed the direction of the project.&lt;/p&gt;

&lt;p&gt;I focused on making the student's own study material the center of the experience.&lt;/p&gt;

&lt;p&gt;That led to a few important decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Answers should be grounded in the uploaded study material.&lt;/li&gt;
&lt;li&gt;Source and page information should be preserved.&lt;/li&gt;
&lt;li&gt;The system should never create fake citations.&lt;/li&gt;
&lt;li&gt;Students should be able to turn their notes into summaries.&lt;/li&gt;
&lt;li&gt;Quizzes should be generated from the same study material.&lt;/li&gt;
&lt;li&gt;Flashcards should support active recall.&lt;/li&gt;
&lt;li&gt;A study plan should help organize revision around an exam date.&lt;/li&gt;
&lt;li&gt;If information is not available in the uploaded material, the AI should clearly say so.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was not to build another general-purpose chatbot.&lt;/p&gt;

&lt;p&gt;The goal was to build something my friend could actually use as part of their study routine.&lt;/p&gt;

&lt;p&gt;That is why the core experience of StudyMate is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Upload → Understand → Ask → Practice → Revise → Improve&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;One of the biggest lessons from building StudyMate was that building an AI feature is very different from building a reliable AI product.&lt;/p&gt;

&lt;p&gt;Getting an AI model to answer a question is relatively easy.&lt;/p&gt;

&lt;p&gt;The harder part is making sure that the answer is based on the correct source, that relevant context is retrieved, that source information is preserved, and that the system knows when it does not have enough information to answer.&lt;/p&gt;

&lt;p&gt;Working on the RAG pipeline also taught me how important retrieval quality is.&lt;/p&gt;

&lt;p&gt;A powerful model with poor context can still produce a poor answer. Giving the model relevant and well-structured context makes the generation much more useful.&lt;/p&gt;

&lt;p&gt;I also learned that the parts of an AI application that users don't immediately see are extremely important.&lt;/p&gt;

&lt;p&gt;During the project, I spent significant time working on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PDF processing&lt;/li&gt;
&lt;li&gt;Page-aware chunking&lt;/li&gt;
&lt;li&gt;Retrieval&lt;/li&gt;
&lt;li&gt;Source attribution&lt;/li&gt;
&lt;li&gt;API error handling&lt;/li&gt;
&lt;li&gt;Loading states&lt;/li&gt;
&lt;li&gt;Responsive UI&lt;/li&gt;
&lt;li&gt;Mobile layouts&lt;/li&gt;
&lt;li&gt;CORS&lt;/li&gt;
&lt;li&gt;Production routing&lt;/li&gt;
&lt;li&gt;Deployment&lt;/li&gt;
&lt;li&gt;Testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project also reinforced an important principle for me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI should not just generate answers. It should behave reliably within the context of the problem it is solving.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For StudyMate, that means being grounded in the student's material and being honest when the material does not contain the answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing
&lt;/h2&gt;

&lt;p&gt;I wanted StudyMate to be more than a happy-path AI demo, so I tested both the backend and the frontend throughout the build.&lt;/p&gt;

&lt;p&gt;The backend currently has:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;46 passing tests&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I also tested the frontend across different screen sizes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1440px desktop&lt;/li&gt;
&lt;li&gt;1024px tablet&lt;/li&gt;
&lt;li&gt;768px tablet&lt;/li&gt;
&lt;li&gt;390px mobile&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The application was checked for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Horizontal overflow&lt;/li&gt;
&lt;li&gt;Console errors&lt;/li&gt;
&lt;li&gt;Failed API requests&lt;/li&gt;
&lt;li&gt;Responsive layouts&lt;/li&gt;
&lt;li&gt;Real API flows&lt;/li&gt;
&lt;li&gt;Grounded answers&lt;/li&gt;
&lt;li&gt;Not-found behavior&lt;/li&gt;
&lt;li&gt;Source and page citations&lt;/li&gt;
&lt;li&gt;Quiz generation&lt;/li&gt;
&lt;li&gt;Flashcards&lt;/li&gt;
&lt;li&gt;Study plans&lt;/li&gt;
&lt;li&gt;Settings persistence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also tested the production deployment.&lt;/p&gt;

&lt;p&gt;During deployment, I found a client-side routing issue where refreshing an internal React route could return a &lt;code&gt;Not Found&lt;/code&gt; page. I fixed this by adding a Render SPA rewrite so routes such as &lt;code&gt;/notes&lt;/code&gt;, &lt;code&gt;/ask&lt;/code&gt;, &lt;code&gt;/quiz&lt;/code&gt;, and &lt;code&gt;/flashcards&lt;/code&gt; correctly load the React application when refreshed.&lt;/p&gt;

&lt;p&gt;The goal was to make sure StudyMate works as an actual application that someone can use, rather than only working during development on my local machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;FastAPI&lt;/li&gt;
&lt;li&gt;Pydantic&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AI &amp;amp; RAG
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gemma 4&lt;/li&gt;
&lt;li&gt;Google Gemini API&lt;/li&gt;
&lt;li&gt;Embeddings&lt;/li&gt;
&lt;li&gt;Retrieval-Augmented Generation (RAG)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data &amp;amp; Storage
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ChromaDB&lt;/li&gt;
&lt;li&gt;SQLite&lt;/li&gt;
&lt;li&gt;PDF/document storage&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Deployment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Render&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Best Use of Gemma
&lt;/h2&gt;

&lt;p&gt;I am entering StudyMate in the &lt;strong&gt;Best Use of Gemma&lt;/strong&gt; category.&lt;/p&gt;

&lt;p&gt;Gemma is not being used as a superficial add-on. It is part of the core generation pipeline that powers the grounded study experience.&lt;/p&gt;

&lt;p&gt;When a student asks a question, StudyMate first retrieves relevant information from the student's uploaded study material using embeddings and ChromaDB. The retrieved context is then passed to Gemma to generate the final grounded response.&lt;/p&gt;

&lt;p&gt;This architecture allows Gemma to work with the student's actual study material instead of treating StudyMate as a general-purpose chatbot.&lt;/p&gt;

&lt;p&gt;For the current deployed version, Gemma is served through the Google Gemini API, while the backend handles the AI orchestration and retrieval pipeline.&lt;/p&gt;

&lt;p&gt;Using Gemma also gives me room to explore future directions such as local inference, different Gemma variants, improved retrieval strategies, and other deployment approaches.&lt;/p&gt;

&lt;p&gt;The model is therefore directly connected to the core problem StudyMate is solving: helping students understand and practice from their own study material.&lt;/p&gt;

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

&lt;p&gt;I started with a simple problem: studying from scattered PDFs and notes was harder than it needed to be.&lt;/p&gt;

&lt;p&gt;That problem became StudyMate.&lt;/p&gt;

&lt;p&gt;Instead of building another general-purpose AI chatbot, I wanted to create a study companion that understands the student's own material, helps them practice, and supports their revision workflow.&lt;/p&gt;

&lt;p&gt;The project taught me that building with AI is not only about choosing a powerful model. It is also about grounding, reliability, source attribution, good product design, and solving a real problem for a real person.&lt;/p&gt;

&lt;p&gt;The core idea behind StudyMate is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn → Ask → Practice → Revise → Improve&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I hope StudyMate can make studying a little more focused, practical, and useful for the person I built it for.&lt;/p&gt;

&lt;p&gt;Thanks for checking it out!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://studymate-frontend-hbi2.onrender.com" rel="noopener noreferrer"&gt;https://studymate-frontend-hbi2.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/codewithvishuuu/studymate" rel="noopener noreferrer"&gt;https://github.com/codewithvishuuu/studymate&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I used AI-assisted development throughout the process of designing, implementing, testing, and polishing StudyMate.&lt;/p&gt;

&lt;p&gt;The development process included planning the architecture, building the RAG pipeline, implementing the study features, testing the application across screen sizes, debugging deployment issues, and preparing the project for release.&lt;/p&gt;

&lt;p&gt;I am not adding a DevRelay session link here because I do not want to publish an unverified or placeholder URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Notes
&lt;/h2&gt;

&lt;p&gt;StudyMate is an open-source project built specifically around the idea of using AI to solve a practical study problem.&lt;/p&gt;

&lt;p&gt;The project is intentionally focused on grounded AI rather than generic AI generation. The student's own study material remains at the center of the experience, while Gemma, RAG, retrieval, and the study tools work together to support learning and revision.&lt;/p&gt;

&lt;p&gt;The project is still evolving, and future improvements will focus on better retrieval, stronger study analytics, more local inference options, and feedback from actual users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thank You
&lt;/h2&gt;

&lt;p&gt;Thank you for taking the time to check out StudyMate.&lt;/p&gt;

&lt;p&gt;I hope this project shows how open AI and thoughtful product design can come together to solve a simple problem for a real person.&lt;/p&gt;

&lt;p&gt;If you try StudyMate, I'd love to hear what you think and what I can improve next.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Building an AI Bug Triage Agent with Swytchcode and Gemini</title>
      <dc:creator>Vishal Kumar</dc:creator>
      <pubDate>Fri, 21 Aug 2026 13:52:42 +0000</pubDate>
      <link>https://dev.to/vvisshuuu2500/building-an-ai-bug-triage-agent-with-swytchcode-and-gemini-3502</link>
      <guid>https://dev.to/vvisshuuu2500/building-an-ai-bug-triage-agent-with-swytchcode-and-gemini-3502</guid>
      <description>&lt;p&gt;𝐓𝐮𝐫𝐧𝐢𝐧𝐠 𝐮𝐧𝐬𝐭𝐫𝐮𝐜𝐭𝐮𝐫𝐞𝐝 𝐛𝐮𝐠 𝐫𝐞𝐩𝐨𝐫𝐭𝐬 𝐢𝐧𝐭𝐨 𝐚𝐜𝐭𝐢𝐨𝐧𝐚𝐛𝐥𝐞 𝐭𝐫𝐢𝐚𝐠𝐞 𝐫𝐞𝐩𝐨𝐫𝐭𝐬 𝐰𝐢𝐭𝐡 𝐀𝐈, 𝐫𝐞𝐭𝐫𝐢𝐞𝐬, 𝐭𝐢𝐦𝐞𝐨𝐮𝐭𝐬, 𝐚𝐧𝐝 𝐢𝐝𝐞𝐦𝐩𝐨𝐭𝐞𝐧𝐜𝐲.&lt;/p&gt;

&lt;p&gt;𝟏.𝐁𝐮𝐢𝐥𝐝𝐢𝐧𝐠 𝐚𝐧 𝐀𝐈 𝐁𝐮𝐠 𝐓𝐫𝐢𝐚𝐠𝐞 𝐀𝐠𝐞𝐧𝐭 𝐰𝐢𝐭𝐡 𝐒𝐰𝐲𝐭𝐜𝐡𝐜𝐨𝐝𝐞 𝐚𝐧𝐝 𝐆𝐞𝐦𝐢𝐧𝐢&lt;/p&gt;

&lt;p&gt;Software bugs are a normal part of development, but analyzing bug reports manually can take a lot of time.&lt;/p&gt;

&lt;p&gt;A developer may receive a bug report containing an error message, incomplete context, or a description of unexpected behavior. Before fixing the issue, they usually need to determine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is the actual problem?&lt;/li&gt;
&lt;li&gt;How severe is it?&lt;/li&gt;
&lt;li&gt;Which part of the application is affected?&lt;/li&gt;
&lt;li&gt;What could be causing it?&lt;/li&gt;
&lt;li&gt;What should be checked first?&lt;/li&gt;
&lt;li&gt;How can the issue be fixed?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To solve this problem, I built an &lt;strong&gt;AI Bug Triage Agent&lt;/strong&gt; using &lt;strong&gt;Swytchcode and Gemini&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The agent takes a bug report as input and automatically generates a structured triage report containing the summary, severity, category, likely root cause, recommended fix, and debugging steps.&lt;/p&gt;

&lt;p&gt;I also implemented two bonus features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Production-oriented execution policies&lt;/li&gt;
&lt;li&gt;Application-level idempotency&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh5gp44sqhvzvj5yu8ymy.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh5gp44sqhvzvj5yu8ymy.png" alt=" " width="297" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Project structure of the AI Bug Triage Agent&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;𝟐.𝐖𝐡𝐚𝐭 𝐃𝐨𝐞𝐬 𝐭𝐡𝐞 𝐏𝐫𝐨𝐣𝐞𝐜𝐭 𝐃𝐨?&lt;/p&gt;

&lt;p&gt;The workflow is simple:&lt;/p&gt;

&lt;p&gt;Bug Report → Python Agent → Swytchcode → Gemini → Structured Bug Triage Report&lt;/p&gt;

&lt;p&gt;The user provides a bug report through a text file or standard input.&lt;/p&gt;

&lt;p&gt;The Python agent sends the report to Gemini through the Swytchcode runtime. Gemini analyzes the issue and returns structured information.&lt;/p&gt;

&lt;p&gt;The final output contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summary&lt;/li&gt;
&lt;li&gt;Severity&lt;/li&gt;
&lt;li&gt;Category&lt;/li&gt;
&lt;li&gt;Likely root cause&lt;/li&gt;
&lt;li&gt;Recommended fix&lt;/li&gt;
&lt;li&gt;Debugging steps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes the output much easier for a developer to understand and act on.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fywkese6axhztbged3i4k.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fywkese6axhztbged3i4k.png" alt=" " width="736" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Example bug report used as input&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh7ba97ew2z417f73du94.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh7ba97ew2z417f73du94.png" alt=" " width="800" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The important part of this architecture is that the Python application does not directly call the Gemini API using an HTTP library or SDK.&lt;/p&gt;

&lt;p&gt;The AI execution goes through:&lt;br&gt;
&lt;code&gt;swytchcode_runtime.exec("gemini.models.generateContent", ...)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy1vkd8z12bcj3fylotwa.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy1vkd8z12bcj3fylotwa.png" alt=" " width="666" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Gemini is accessed through the Swytchcode runtime&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;𝟒. 𝐖𝐡𝐲 𝐒𝐰𝐲𝐭𝐜𝐡𝐜𝐨𝐝𝐞?&lt;/p&gt;

&lt;p&gt;One of the main goals of this project was to use Swytchcode as the execution layer for the AI integration.&lt;/p&gt;

&lt;p&gt;Instead of adding a direct HTTP client or an SDK to the Python application, the project uses the Swytchcode runtime.&lt;/p&gt;

&lt;p&gt;This provides a clean separation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python handles the application logic.&lt;/li&gt;
&lt;li&gt;Swytchcode handles the integration execution.&lt;/li&gt;
&lt;li&gt;Gemini handles the AI analysis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project therefore keeps the AI provider integration separate from the core bug-triage logic.&lt;/p&gt;

&lt;p&gt;𝟓. 𝐆𝐞𝐦𝐢𝐧𝐢 𝐈𝐧𝐭𝐞𝐠𝐫𝐚𝐭𝐢𝐨𝐧&lt;/p&gt;

&lt;p&gt;For the AI model, I used Gemini.&lt;/p&gt;

&lt;p&gt;The integration is defined as a custom Swytchcode integration using the Gemini &lt;code&gt;generateContent&lt;/code&gt; endpoint.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffhgvtdh4onb6m4if11u4.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffhgvtdh4onb6m4if11u4.png" alt=" " width="719" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The API key is stored locally using an environment variable:&lt;br&gt;
&lt;code&gt;env&lt;br&gt;
GOOGLE_GEMINI_KEY=your_api_key_here&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;𝟔.𝐁𝐨𝐧𝐮𝐬: 𝐈𝐝𝐞𝐦𝐩𝐨𝐭𝐞𝐧𝐜𝐲&lt;/p&gt;

&lt;p&gt;Another bonus feature I implemented is application-level idempotency.&lt;/p&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;p&gt;If the exact same bug report is submitted again, the application should recognize that it has already been processed and avoid making another unnecessary AI call.&lt;/p&gt;

&lt;p&gt;To achieve this, the application generates a deterministic SHA-256 hash from the normalized bug report.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;p&gt;text&lt;br&gt;
Bug Report&lt;br&gt;
    ↓&lt;br&gt;
Normalize content&lt;br&gt;
    ↓&lt;br&gt;
SHA-256&lt;br&gt;
    ↓&lt;br&gt;
Idempotency Key&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj8mazbzjq6dmxu8s0dap.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj8mazbzjq6dmxu8s0dap.png" alt=" " width="799" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Idempotency prevents duplicate processing of the same bug report&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;𝟕.&lt;code&gt;.gitignore&lt;/code&gt; 𝐒𝐞𝐜𝐮𝐫𝐢𝐭𝐲 &lt;/p&gt;

&lt;p&gt;API credentials should never be hardcoded into an application or committed to GitHub.&lt;/p&gt;

&lt;p&gt;For this project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Gemini API key is stored in an environment variable.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt; is ignored by Git.&lt;/li&gt;
&lt;li&gt;The API key is never printed in the normal output.&lt;/li&gt;
&lt;li&gt;Dry-run output redacts the API key.&lt;/li&gt;
&lt;li&gt;The idempotency key is generated only from the bug report content and does not contain the API key.&lt;/li&gt;
&lt;li&gt;The local cache file is also ignored by Git.&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftsy14ebems3qobhs7gxj.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftsy14ebems3qobhs7gxj.png" alt=" " width="303" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before pushing the project to GitHub, I verified that the real &lt;code&gt;.env&lt;/code&gt; file was not included in the Git commit.&lt;/p&gt;

&lt;p&gt;𝟖.𝐓𝐞𝐬𝐭𝐢𝐧𝐠&lt;/p&gt;

&lt;p&gt;I performed several tests before publishing the project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Basic validation
&lt;/h3&gt;

&lt;p&gt;bash&lt;br&gt;
&lt;code&gt;python -m py_compile bug_triage_agent.py&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The Python compilation test passed successfully.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;python bug_triage_agent.py sample_bug.txt --dry-run&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;𝟗.𝐖𝐡𝐚𝐭 𝐈 𝐋𝐞𝐚𝐫𝐧𝐞𝐝&lt;/p&gt;

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

&lt;p&gt;Building this project taught me several practical lessons.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. AI integration is more than calling a model
&lt;/h3&gt;

&lt;p&gt;A useful AI application needs input validation, response parsing, error handling, and predictable output.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Execution policies matter
&lt;/h3&gt;

&lt;p&gt;Timeouts and controlled retries make external AI calls more reliable without creating unnecessary repeated requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Idempotency is useful for AI workflows
&lt;/h3&gt;

&lt;p&gt;Repeated requests can waste API resources. Detecting identical inputs can prevent unnecessary processing.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Secrets must be handled carefully
&lt;/h3&gt;

&lt;p&gt;API keys should stay outside source code and should never be committed to a public repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Integration layers can simplify application architecture
&lt;/h3&gt;

&lt;p&gt;Using Swytchcode as the execution layer allowed me to keep the application logic separate from the AI integration.&lt;/p&gt;

&lt;p&gt;𝟏𝟎.𝐆𝐢𝐭𝐇𝐮𝐛&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Repository
&lt;/h2&gt;

&lt;p&gt;The complete source code is available on GitHub:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/codewithvishuuu/swytchcode-ai-bug-triage" rel="noopener noreferrer"&gt;https://github.com/codewithvishuuu/swytchcode-ai-bug-triage&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository contains the Python agent, Swytchcode Gemini integration, configuration, documentation, and sample bug report.&lt;/p&gt;

&lt;p&gt;𝟏𝟏.𝐃𝐞𝐦𝐨&lt;/p&gt;

&lt;p&gt;I also created a short demo showing the complete workflow:&lt;/p&gt;

&lt;p&gt;Bug Report → &lt;a href="https://www.swytchcode.com/" rel="noopener noreferrer"&gt;Swytchcode&lt;/a&gt; → &lt;a href="https://aistudio.google.com/prompts/new_chat" rel="noopener noreferrer"&gt;Gemini&lt;/a&gt; → Bug Triage Report&lt;/p&gt;

&lt;p&gt;The demo also shows the idempotency feature and the generated result.&lt;/p&gt;

&lt;p&gt;𝟏𝟐.𝐂𝐨𝐧𝐜𝐥𝐮𝐬𝐢𝐨𝐧&lt;/p&gt;

&lt;p&gt;The AI Bug Triage Agent demonstrates how AI can be used to automate an everyday software-development task.&lt;/p&gt;

&lt;p&gt;Instead of manually reading and categorizing every bug report, the agent can quickly generate a structured analysis containing severity, category, root cause, recommended fixes, and debugging steps.&lt;/p&gt;

&lt;p&gt;By combining Gemini with &lt;a href="https://www.swytchcode.com/" rel="noopener noreferrer"&gt;Swytchcode&lt;/a&gt; and adding execution policies and idempotency, the project goes beyond a basic AI API demo and focuses on reliability, security, and practical developer workflows.&lt;/p&gt;

&lt;p&gt;This project was built as part of Task 3 and was a great opportunity to explore AI agents, integration management, and production-oriented patterns.&lt;/p&gt;

&lt;p&gt;𝙏𝙝𝙖𝙣𝙠 𝙮𝙤𝙪 𝙛𝙤𝙧 𝙧𝙚𝙖𝙙𝙞𝙣𝙜! 𝙁𝙚𝙚𝙡 𝙛𝙧𝙚𝙚 𝙩𝙤 𝙧𝙚𝙖𝙘𝙝 𝙤𝙪𝙩 𝙤𝙧 𝙘𝙤𝙣𝙣𝙚𝙘𝙩 𝙤𝙣 &lt;a href="https://www.linkedin.com/in/vishal-kumar-805248335/" rel="noopener noreferrer"&gt;𝙇𝙞𝙣𝙠𝙚𝙙𝙄𝙣&lt;/a&gt; / &lt;a href="https://github.com/codewithvishuuu/swytchcode-ai-bug-triage" rel="noopener noreferrer"&gt;𝙂𝙞𝙩𝙃𝙪𝙗&lt;/a&gt;🤝&lt;br&gt;
𝑽𝒊𝒔𝒉𝒂𝒍 𝑲𝒖𝒎𝒂𝒓💖&lt;/p&gt;

</description>
      <category>ai</category>
      <category>swytchcode</category>
      <category>productivity</category>
      <category>python</category>
    </item>
    <item>
      <title>Building Aarogya Sahayak: My 10-Day Journey Building a Voice AI Health Assistant</title>
      <dc:creator>Vishal Kumar</dc:creator>
      <pubDate>Sat, 15 Aug 2026 14:44:25 +0000</pubDate>
      <link>https://dev.to/vvisshuuu2500/building-aarogya-sahayak-my-10-day-journey-building-a-voice-ai-health-assistant-3cb9</link>
      <guid>https://dev.to/vvisshuuu2500/building-aarogya-sahayak-my-10-day-journey-building-a-voice-ai-health-assistant-3cb9</guid>
      <description>&lt;p&gt;𝐅𝐫𝐨𝐦 𝐚 𝐛𝐚𝐬𝐢𝐜 𝐯𝐨𝐢𝐜𝐞 𝐚𝐬𝐬𝐢𝐬𝐭𝐚𝐧𝐭 𝐭𝐨 𝐡𝐮𝐦𝐚𝐧 𝐞𝐬𝐜𝐚𝐥𝐚𝐭𝐢𝐨𝐧, 𝐜𝐚𝐥𝐥 𝐚𝐧𝐚𝐥𝐲𝐭𝐢𝐜𝐬, 𝐦𝐮𝐥𝐭𝐢𝐥𝐢𝐧𝐠𝐮𝐚𝐥 𝐜𝐨𝐧𝐯𝐞𝐫𝐬𝐚𝐭𝐢𝐨𝐧𝐬, 𝐚𝐧𝐝 𝐬𝐩𝐞𝐜𝐢𝐚𝐥𝐢𝐬𝐭 𝐡𝐚𝐧𝐝𝐨𝐟𝐟𝐬.&lt;/p&gt;

&lt;p&gt;𝟏. 𝐓𝐡𝐞 𝐏𝐫𝐨𝐛𝐥𝐞𝐦 𝐚𝐧𝐝 𝐭𝐡𝐞 𝐔𝐬𝐞𝐫𝐬&lt;/p&gt;

&lt;p&gt;Healthcare can be difficult to navigate, especially when users are not sure whether they need general health guidance, a clinic appointment, or support from a real person.&lt;/p&gt;

&lt;p&gt;For this project, I chose the &lt;strong&gt;Health Access&lt;/strong&gt; track and built "𝐀𝐚𝐫𝐨𝐠𝐲𝐚 𝐒𝐚𝐡𝐚𝐲𝐚𝐤", a voice-based health and wellness assistant designed to make basic health conversations easier and more accessible.&lt;/p&gt;

&lt;p&gt;The idea was not to build an AI doctor or replace medical professionals. Instead, "𝐀𝐚𝐫𝐨𝐠𝐲𝐚 𝐒𝐚𝐡𝐚𝐲𝐚𝐤" is designed to help users with general health and wellness questions, guide them toward appropriate next steps, and connect them with human support when a situation requires it.&lt;/p&gt;

&lt;p&gt;I chose voice because users can speak naturally instead of typing everything into a chat box. This makes the interaction feel more like a real conversation and can be especially useful for people who prefer speaking over typing.&lt;/p&gt;

&lt;p&gt;The project also focuses on safety. When a conversation involves diagnosis requests, emergency or red-flag situations, or needs human intervention, the agent follows dedicated safety and escalation flows instead of trying to handle everything itself.&lt;/p&gt;

&lt;p&gt;The assistant also supports scheduled reminder calls, allowing users to request reminders naturally and receive a follow-up call at the requested time. This extends the experience beyond a single conversation while keeping the existing safety and consent rules in place.&lt;/p&gt;

&lt;p&gt;𝟐. 𝐖𝐡𝐚𝐭 𝐭𝐡𝐞 𝐕𝐨𝐢𝐜𝐞 𝐀𝐠𝐞𝐧𝐭 𝐃𝐨𝐞𝐬&lt;/p&gt;

&lt;p&gt;𝐀𝐚𝐫𝐨𝐠𝐲𝐚 𝐒𝐚𝐡𝐚𝐲𝐚𝐤 is built as a conversational voice assistant rather than a simple question-and-answer bot.&lt;/p&gt;

&lt;p&gt;A user can start a natural conversation about general health and wellness. The main agent can provide basic guidance while following clear safety boundaries. It does not try to diagnose medical conditions or act as a replacement for a healthcare professional.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝗟𝗮𝗻𝗴𝘂𝗮𝗴𝗲 𝗦𝗲𝗹𝗲𝗰𝘁𝗶𝗼𝗻&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of the important improvements I added was a language-selection flow.&lt;/p&gt;

&lt;p&gt;Before starting a conversation, the user can choose between "𝗘𝗻𝗴𝗹𝗶𝘀𝗵" 𝗮𝗻𝗱 "𝗛𝗶𝗻𝗱𝗶". Once selected, the preferred language is carried through the agent session so the conversation stays consistent instead of randomly switching languages.&lt;/p&gt;

&lt;p&gt;For Hindi conversations, the agent is instructed to respond using "𝗗𝗲𝘃𝗮𝗻𝗮𝗴𝗮𝗿𝗶 𝘀𝗰𝗿𝗶𝗽𝘁" rather than Romanized Hindi. This makes the conversation more natural for users who prefer reading and speaking Hindi.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝗛𝘂𝗺𝗮𝗻 𝗦𝘂𝗽𝗽𝗼𝗿𝘁&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a situation needs human assistance, 𝐀𝐚𝐫𝐨𝐠𝐲𝐚 𝐒𝐚𝐡𝐚𝐲𝐚𝐤 can create a human support request and provide a unique reference ID.&lt;/p&gt;

&lt;p&gt;The user can later use that reference ID on the Human Support page to check the status of the request.&lt;/p&gt;

&lt;p&gt;The public support page is intentionally privacy-focused. It displays only safe request metadata such as the reference ID, status, timestamps, urgency, and follow-up information. Conversation content and sensitive health details are not exposed on the public page.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝗦𝗽𝗲𝗰𝗶𝗮𝗹𝗶𝘀𝘁 𝗔𝗴𝗲𝗻𝘁 𝗛𝗮𝗻𝗱𝗼𝗳𝗳&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another important feature is the "𝗖𝗹𝗶𝗻𝗶𝗰 &amp;amp; 𝗔𝗽𝗽𝗼𝗶𝗻𝘁𝗺𝗲𝗻𝘁 𝗦𝗽𝗲𝗰𝗶𝗮𝗹𝗶𝘀𝘁".&lt;/p&gt;

&lt;p&gt;When a user clearly wants to book or prepare for a clinic appointment, the main agent can hand the conversation to this dedicated specialist instead of trying to handle every task itself.&lt;/p&gt;

&lt;p&gt;The specialist can help with appointment-related questions, preparation, preferred appointment timing, and general visit guidance.&lt;/p&gt;

&lt;p&gt;The user does not have to repeat the entire problem because relevant context is transferred during the handoff.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝗦𝗽𝗲𝗰𝗶𝗮𝗹𝗶𝘀𝘁 𝗛𝗮𝗻𝗱𝗯𝗮𝗰𝗸&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The specialist can also hand the conversation back to the main health assistant when the appointment-related task is complete or when the user wants to discuss a general health topic.&lt;/p&gt;

&lt;p&gt;This creates a simple multi-agent flow where each agent has a focused responsibility.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝗖𝗮𝗹𝗹 𝗔𝗻𝗮𝗹𝘆𝘁𝗶𝗰𝘀&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also built a Call Analytics Dashboard to make the voice agent measurable instead of relying only on how the conversation feels.&lt;/p&gt;

&lt;p&gt;The dashboard tracks real call outcomes such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total calls&lt;/li&gt;
&lt;li&gt;Successful calls&lt;/li&gt;
&lt;li&gt;Failed calls&lt;/li&gt;
&lt;li&gt;Call outcome trends&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The success and failure logic is connected to actual call outcomes rather than hardcoded numbers.&lt;/p&gt;

&lt;p&gt;This helped me understand whether the agent was actually completing useful conversations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝗦𝗰𝗵𝗲𝗱𝘂𝗹𝗲𝗱 𝗥𝗲𝗺𝗶𝗻𝗱𝗲𝗿 𝗖𝗮𝗹𝗹𝘀&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A new feature I added is scheduled reminder calling.&lt;/p&gt;

&lt;p&gt;Users can ask the agent to schedule a reminder naturally, such as "Remind me in 5 minutes to drink water." The agent understands relative or specific times, validates the requested timezone when needed, and creates a reminder with a unique reference ID.&lt;/p&gt;

&lt;p&gt;The reminder is processed by the existing outbound calling system instead of using a separate dialing implementation. An exactly-once mechanism prevents the same reminder from being dialed multiple times.&lt;/p&gt;

&lt;p&gt;Users can also open the Scheduled Reminders page to check the reminder status and cancel a reminder while it is still pending.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝗪𝗲𝗹𝗹𝗻𝗲𝘀𝘀 𝗧𝗶𝗽𝘀&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also added a dedicated Wellness Tips section for users who want simple general wellness guidance outside the live conversation.&lt;/p&gt;

&lt;p&gt;It includes five areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hydration&lt;/li&gt;
&lt;li&gt;Sleep &amp;amp; Rest&lt;/li&gt;
&lt;li&gt;Healthy Eating&lt;/li&gt;
&lt;li&gt;Daily Activity&lt;/li&gt;
&lt;li&gt;Stress &amp;amp; Relaxation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The section is designed for general wellness information and includes a clear disclaimer that it is not medical advice.&lt;/p&gt;

&lt;p&gt;𝟑.𝐇𝐨𝐰 𝐭𝐡𝐞 𝐒𝐲𝐬𝐭𝐞𝐦 𝐖𝐨𝐫𝐤𝐬&lt;/p&gt;

&lt;p&gt;𝐀𝐚𝐫𝐨𝐠𝐲𝐚 𝐒𝐚𝐡𝐚𝐲𝐚𝐤 is built around a real-time voice conversation pipeline. The goal was to keep the interaction simple for the user while allowing different parts of the system to handle different responsibilities.&lt;/p&gt;

&lt;p&gt;At a high level, the flow looks 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftgma389m6ti1y8gmeccz.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftgma389m6ti1y8gmeccz.png" alt=" " width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝟭.𝗨𝘀𝗲𝗿 𝗮𝗻𝗱 𝗙𝗿𝗼𝗻𝘁𝗲𝗻𝗱
The user starts the conversation from the web interface and can choose their preferred language before the voice session begins.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The frontend handles the conversation interface, voice controls, language selection, agent status, and other user-facing states.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝟮.𝗥𝗲𝗮𝗹-𝗧𝗶𝗺𝗲 𝗩𝗼𝗶𝗰𝗲 𝗧𝗿𝗮𝗻𝘀𝗽𝗼𝗿𝘁
The voice conversation runs through "𝗟𝗶𝘃𝗲𝗞𝗶𝘁", which provides the real-time communication layer between the user and the agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows the agent to receive the user's audio, process it, and return spoken responses during the same conversation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝟯. 𝗦𝗽𝗲𝗲𝗰𝗵-𝘁𝗼-𝗧𝗲𝘅𝘁
When the user speaks, their audio is converted into text so the language model can understand the request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This text becomes the input for the agent's reasoning and routing logic.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝟰.𝗠𝗮𝗶𝗻 𝗔𝗴𝗲𝗻𝘁
The main 𝐀𝐚𝐫𝐨𝐠𝐲𝐚 𝐒𝐚𝐡𝐚𝐲𝐚𝐤 agent is responsible for general health and wellness conversations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It follows a system prompt containing its role, objectives, safety rules, language instructions, and routing decisions.&lt;/p&gt;

&lt;p&gt;The main agent does not try to handle every request itself. Depending on the conversation, it can use tools or hand the conversation to another part of the system.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝟱. 𝗧𝗼𝗼𝗹𝘀 𝗮𝗻𝗱 𝗥𝗼𝘂𝘁𝗶𝗻𝗴
The agent can use dedicated tools when a task requires an action rather than a simple response.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, a clear clinic or appointment request can trigger a handoff to the "Clinic &amp;amp; Appointment Specialist".&lt;/p&gt;

&lt;p&gt;Emergency or red-flag situations follow the existing escalation flow instead of being sent to the appointment specialist.&lt;/p&gt;

&lt;p&gt;This separation keeps the responsibilities of each agent clear.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝟲.𝗦𝗰𝗵𝗲𝗱𝘂𝗹𝗲𝗱 𝗥𝗲𝗺𝗶𝗻𝗱𝗲𝗿 𝗙𝗹𝗼𝘄&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent can also create scheduled reminders from natural-language requests.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fueqcj3bv1k8cgno1etom.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fueqcj3bv1k8cgno1etom.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When a user asks for a reminder, the request is parsed and stored with a unique reference ID. The scheduler checks for due reminders and triggers the existing outbound calling system at the scheduled time.&lt;/p&gt;

&lt;p&gt;The reminder system uses an exactly-once claiming mechanism to prevent duplicate calls. Users can also check the reminder status or cancel a reminder while it is still pending.&lt;/p&gt;

&lt;p&gt;This flow reuses the existing outbound dialer instead of introducing a separate calling system.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝟳.𝗦𝗽𝗲𝗰𝗶𝗮𝗹𝗶𝘀𝘁 𝗔𝗴𝗲𝗻𝘁
The Clinic &amp;amp; Appointment Specialist is a separate agent with its own instructions and responsibilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;During a handoff, only relevant context is transferred instead of exposing the entire conversation unnecessarily.&lt;/p&gt;

&lt;p&gt;The specialist can continue the conversation without asking the user to repeat the original request.&lt;/p&gt;

&lt;p&gt;When its task is complete or the user changes back to a general health topic, the specialist can hand the conversation back to the main agent.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝟴.𝗧𝗲𝘅𝘁-𝘁𝗼-𝗦𝗽𝗲𝗲𝗰𝗵
After the agent generates a response, it is converted back into speech so the user can hear the answer naturally.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this project, I used "𝗠𝘂𝗿𝗳 𝗙𝗮𝗹𝗰𝗼𝗻" for the voice experience.&lt;/p&gt;

&lt;p&gt;One of the things I wanted to achieve was a conversational experience that feels closer to talking to an assistant rather than interacting with a traditional text chatbot.&lt;/p&gt;

&lt;p&gt;Architecture Overview&lt;/p&gt;

&lt;p&gt;The overall architecture can be represented as:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsa7ip6vf3xt9auiilipy.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsa7ip6vf3xt9auiilipy.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;𝟒. 𝐓𝐡𝐞 𝐌𝐨𝐬𝐭 𝐈𝐦𝐩𝐨𝐫𝐭𝐚𝐧𝐭 𝐅𝐞𝐚𝐭𝐮𝐫𝐞𝐬&lt;/p&gt;

&lt;p&gt;Over the course of the challenge, I gradually added features that made "Aarogya Sahayak" more useful, safer, and easier to evaluate.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝗦𝗮𝗳𝗲𝘁𝘆 𝗚𝘂𝗮𝗿𝗱𝗿𝗮𝗶𝗹𝘀
The agent has clear boundaries around what it can and cannot do.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is designed for general health and wellness guidance, not medical diagnosis. Emergency or red-flag situations follow a separate escalation flow instead of being routed to the appointment specialist.&lt;/p&gt;

&lt;p&gt;The agent also avoids asking users for sensitive information such as passwords, OTPs, PINs, or card details.&lt;/p&gt;

&lt;p&gt;𝟭.𝗛𝘂𝗺𝗮𝗻 𝗘𝘀𝗰𝗮𝗹𝗮𝘁𝗶𝗼𝗻&lt;br&gt;
When a conversation needs human intervention, the agent can create a support request and generate a unique reference ID.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl51ravxqu1p89ln3my7t.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl51ravxqu1p89ln3my7t.png" alt=" " width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The user can use this ID to check the request status later through the Human Support 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn0ph65z4umfa1l2ssaee.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn0ph65z4umfa1l2ssaee.png" alt=" " width="800" height="793"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9xq5t3y2jgeuez41j5ax.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9xq5t3y2jgeuez41j5ax.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The public status page is intentionally privacy-focused and does not expose the user's conversation or sensitive health information.&lt;/p&gt;

&lt;p&gt;𝟮.𝗖𝗹𝗶𝗻𝗶𝗰 𝗮𝗻𝗱 𝗔𝗽𝗽𝗼𝗶𝗻𝘁𝗺𝗲𝗻𝘁 𝗦𝗽𝗲𝗰𝗶𝗮𝗹𝗶𝘀𝘁&lt;br&gt;
Instead of making the main agent responsible for everything, I created a dedicated "Clinic &amp;amp; Appointment Specialist".&lt;/p&gt;

&lt;p&gt;The specialist focuses on appointment-related tasks such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understanding appointment requests&lt;/li&gt;
&lt;li&gt;Helping with clinic visit preparation&lt;/li&gt;
&lt;li&gt;Discussing preferred appointment timing&lt;/li&gt;
&lt;li&gt;Providing general appointment guidance&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjjihrqa11nd70ot74hkr.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjjihrqa11nd70ot74hkr.png" alt=" " width="800" height="666"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The main agent announces the handoff before switching the conversation, and the specialist introduces itself after taking over.&lt;/p&gt;

&lt;p&gt;𝟯.𝗦𝗽𝗲𝗰𝗶𝗮𝗹𝗶𝘀𝘁 𝗛𝗮𝗻𝗱𝗯𝗮𝗰𝗸&lt;br&gt;
The specialist can also return the conversation to the main health assistant.&lt;/p&gt;

&lt;p&gt;For example, if the user finishes discussing an appointment and asks for general wellness advice, the specialist can hand the conversation back instead of continuing outside its scope.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0h4edny0mlyds8styzpy.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0h4edny0mlyds8styzpy.png" alt=" " width="799" height="709"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Relevant context is preserved during both handoff and handback so the user does not have to repeat everything.&lt;/p&gt;

&lt;p&gt;𝟰.𝗠𝘂𝗹𝘁𝗶𝗹𝗶𝗻𝗴𝘂𝗮𝗹 𝗖𝗼𝗻𝘃𝗲𝗿𝘀𝗮𝘁𝗶𝗼𝗻𝘀&lt;br&gt;
The agent supports both &lt;strong&gt;English and Hindi&lt;/strong&gt; through a language-selection flow.&lt;/p&gt;

&lt;p&gt;The user chooses the preferred language before starting the conversation. The selected language is then carried through the agent session.&lt;/p&gt;

&lt;p&gt;For Hindi conversations, the agent is instructed to use "𝗗𝗲𝘃𝗮𝗻𝗮𝗴𝗮𝗿𝗶 𝘀𝗰𝗿𝗶𝗽𝘁" rather than randomly switching to Romanized Hindi.&lt;/p&gt;

&lt;p&gt;𝟱.𝗖𝗮𝗹𝗹 𝗔𝗻𝗮𝗹𝘆𝘁𝗶𝗰𝘀&lt;br&gt;
I built a Call Analytics Dashboard that records real call outcomes.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1ddru1y3qzn60lacbyk1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1ddru1y3qzn60lacbyk1.png" alt=" " width="800" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It tracks metrics such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total calls&lt;/li&gt;
&lt;li&gt;Successful calls&lt;/li&gt;
&lt;li&gt;Failed calls&lt;/li&gt;
&lt;li&gt;Call outcome trends&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdy3o1329y06xyg55y8j8.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdy3o1329y06xyg55y8j8.png" alt=" " width="800" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The success condition is based on actual conversation outcomes, such as successful health guidance or successful human escalation, rather than simply counting every completed call as successful.&lt;/p&gt;

&lt;p&gt;This made the system measurable and helped me evaluate whether the agent was actually completing useful conversations.&lt;/p&gt;

&lt;p&gt;𝟲.𝗦𝗰𝗵𝗲𝗱𝘂𝗹𝗲𝗱 𝗥𝗲𝗺𝗶𝗻𝗱𝗲𝗿 𝗖𝗮𝗹𝗹𝘀&lt;/p&gt;

&lt;p&gt;One of the major features I added was scheduled reminder calling.&lt;/p&gt;

&lt;p&gt;Users can ask "Aarogya Sahayak" to schedule a reminder using natural language, for example:&lt;/p&gt;

&lt;p&gt;"Remind me in 5 minutes to drink water."&lt;/p&gt;

&lt;p&gt;The agent understands the requested time, handles timezone and AM/PM clarification when required, and creates a reminder with a unique reference ID.&lt;/p&gt;

&lt;p&gt;The reminder is then stored and monitored by a background scheduler. When the scheduled time arrives, the system reuses the existing outbound calling infrastructure to place the reminder call.&lt;/p&gt;

&lt;p&gt;A key reliability feature is the exactly-once mechanism, which prevents the same reminder from being triggered more than once.&lt;/p&gt;

&lt;p&gt;Users can also check the status of a reminder using its reference ID and cancel a reminder while it is still pending.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj5bmn846mcvwlkyakku1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj5bmn846mcvwlkyakku1.png" alt=" " width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This turned reminders from a simple notification concept into an actual scheduled voice-call workflow connected to the existing agent infrastructure.&lt;/p&gt;

&lt;p&gt;𝟳.𝗪𝗲𝗹𝗹𝗻𝗲𝘀𝘀 𝗧𝗶𝗽𝘀&lt;/p&gt;

&lt;p&gt;I also added a dedicated Wellness Tips section for users who want simple health and wellness information without starting a full voice conversation.&lt;/p&gt;

&lt;p&gt;The section provides practical, general wellness tips across five areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hydration&lt;/li&gt;
&lt;li&gt;Sleep &amp;amp; Rest&lt;/li&gt;
&lt;li&gt;Healthy Eating&lt;/li&gt;
&lt;li&gt;Daily Activity&lt;/li&gt;
&lt;li&gt;Stress &amp;amp; Relaxation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each category contains short and easy-to-follow suggestions so users can quickly find relevant information.&lt;/p&gt;

&lt;p&gt;The feature is intentionally focused on general wellness rather than diagnosis or treatment. A clear disclaimer reminds users that the information is not medical advice.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnnu7szc8peaex2j7bu8u.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnnu7szc8peaex2j7bu8u.png" alt=" " width="800" height="833"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This gives users another way to interact with Aarogya Sahayak when they simply want quick wellness guidance.&lt;/p&gt;

&lt;p&gt;𝟓. 𝐂𝐡𝐚𝐥𝐥𝐞𝐧𝐠𝐞𝐬 𝐚𝐧𝐝 𝐇𝐨𝐰 𝐈 𝐎𝐯𝐞𝐫𝐜𝐚𝐦𝐞 𝐓𝐡𝐞𝐦&lt;/p&gt;

&lt;p&gt;Building a voice agent over multiple days was not always straightforward. A few problems taught me more than the features themselves.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝗞𝗲𝗲𝗽𝗶𝗻𝗴 𝗔𝗴𝗲𝗻𝘁 𝗥𝗲𝘀𝗽𝗼𝗻𝘀𝗶𝗯𝗶𝗹𝗶𝘁𝗶𝗲𝘀 𝗦𝗲𝗽𝗮𝗿𝗮𝘁𝗲
Initially, it would have been easy to let one agent handle everything.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead, I separated responsibilities between the main health assistant and the Clinic &amp;amp; Appointment Specialist.&lt;/p&gt;

&lt;p&gt;The main agent handles general health conversations and safety routing, while the specialist focuses only on clinic and appointment-related tasks.&lt;/p&gt;

&lt;p&gt;This made the routing logic clearer and reduced the chance of the specialist answering questions outside its intended role.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝗖𝗼𝗻𝘁𝗲𝘅𝘁 𝗗𝘂𝗿𝗶𝗻𝗴 𝗛𝗮𝗻𝗱𝗼𝗳𝗳𝘀
Another challenge was making sure the specialist understood what the user had already asked.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I did not want the user to repeat the entire conversation after every handoff.&lt;/p&gt;

&lt;p&gt;The solution was to transfer only the relevant context, including a short request summary and the user's latest request, instead of transferring the entire conversation.&lt;/p&gt;

&lt;p&gt;The same principle is used when handing the conversation back to the main agent.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝗟𝗮𝗻𝗴𝘂𝗮𝗴𝗲 𝗖𝗼𝗻𝘀𝗶𝘀𝘁𝗲𝗻𝗰𝘆
Another issue appeared when the agent sometimes mixed English and Hindi or used Romanized Hindi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I added an explicit language-selection flow and made the selected language part of the agent session context.&lt;/p&gt;

&lt;p&gt;For Hindi, the instructions explicitly require "Devanagari script" and prevent the agent from switching back to Romanized Hindi.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝗦𝗰𝗵𝗲𝗱𝘂𝗹𝗲𝗱 𝗥𝗲𝗺𝗶𝗻𝗱𝗲𝗿 𝗖𝗮𝗹𝗹𝘀
Adding scheduled reminder calls introduced another engineering challenge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system needed to understand natural-language time requests such as "in 5 minutes" while handling timezone and AM/PM ambiguity safely.&lt;/p&gt;

&lt;p&gt;Another important requirement was preventing the same reminder from triggering more than once. Since the scheduler checks for due reminders repeatedly, simply checking the reminder status was not enough.&lt;/p&gt;

&lt;p&gt;I implemented an atomic claiming mechanism so that each reminder is claimed exactly once before the outbound call is triggered. Reminders then move through states such as pending, triggered, completed, failed, or cancelled.&lt;/p&gt;

&lt;p&gt;I also reused the existing outbound calling system instead of creating a separate dialing implementation. This kept the reminder feature integrated with the project's existing calling infrastructure.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝗧𝗲𝘀𝘁𝗶𝗻𝗴 𝘄𝗶𝘁𝗵 𝗟𝗶𝗺𝗶𝘁𝗲𝗱 𝗟𝗟𝗠 𝗤𝘂𝗼𝘁𝗮
Some behavioral tests depend on LiveKit hosted inference and could not always be executed because the available free inference quota was exhausted.&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ttxrqngnmhje7p2vkbl.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ttxrqngnmhje7p2vkbl.png" alt=" " width="797" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instead of treating those failures as application failures, I separated deterministic tests from LLM-dependent tests.&lt;/p&gt;

&lt;p&gt;The deterministic test suite, linting, formatting, type checking, and frontend build could still be verified locally.&lt;/p&gt;

&lt;p&gt;This was an important lesson: an external service failure and an application bug are not necessarily the same thing.&lt;/p&gt;

&lt;p&gt;𝟔. 𝐇𝐨𝐰 𝐑𝐞𝐚𝐝𝐞𝐫𝐬 𝐂𝐚𝐧 𝐁𝐮𝐢𝐥𝐝 𝐚𝐧𝐝 𝐑𝐮𝐧 𝐈𝐭:&lt;/p&gt;

&lt;p&gt;If you want to build a similar voice agent, the architecture can be broken into four main parts:&lt;/p&gt;

&lt;p&gt;𝟭. 𝗦𝗽𝗲𝗲𝗰𝗵-𝘁𝗼-𝗧𝗲𝘅𝘁 (𝗦𝗧𝗧) 𝘁𝗼 𝘂𝗻𝗱𝗲𝗿𝘀𝘁𝗮𝗻𝗱 𝘄𝗵𝗮𝘁 𝘁𝗵𝗲 𝘂𝘀𝗲𝗿 𝘀𝗮𝘆𝘀&lt;/p&gt;

&lt;p&gt;𝟮. 𝗟𝗟𝗠 𝘁𝗼 𝘂𝗻𝗱𝗲𝗿𝘀𝘁𝗮𝗻𝗱 𝘁𝗵𝗲 𝗿𝗲𝗾𝘂𝗲𝘀𝘁 𝗮𝗻𝗱 𝗱𝗲𝗰𝗶𝗱𝗲 𝘄𝗵𝗮𝘁 𝘁𝗼 𝗱𝗼&lt;/p&gt;

&lt;p&gt;𝟯. 𝗧𝗲𝘅𝘁-𝘁𝗼-𝗦𝗽𝗲𝗲𝗰𝗵 (𝗧𝗧𝗦) 𝘁𝗼 𝘀𝗽𝗲𝗮𝗸 𝘁𝗵𝗲 𝗿𝗲𝘀𝗽𝗼𝗻𝘀𝗲&lt;/p&gt;

&lt;p&gt;𝟰. 𝗥𝗲𝗮𝗹-𝘁𝗶𝗺𝗲 𝘁𝗿𝗮𝗻𝘀𝗽𝗼𝗿𝘁 𝘁𝗼 𝗰𝗼𝗻𝗻𝗲𝗰𝘁 𝘁𝗵𝗲 𝘂𝘀𝗲𝗿 𝗮𝗻𝗱 𝗮𝗴𝗲𝗻𝘁 𝗱𝘂𝗿𝗶𝗻𝗴 𝗮 𝗹𝗶𝘃𝗲 𝗰𝗼𝗻𝘃𝗲𝗿𝘀𝗮𝘁𝗶𝗼𝗻&lt;/p&gt;

&lt;p&gt;For Aarogya Sahayak, I used LiveKit for the real-time agent session and Murf Falcon for the voice experience.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝐂𝐥𝐨𝐧𝐞 𝐭𝐡𝐞 𝐏𝐫𝐨𝐣𝐞𝐜𝐭
Start by cloning the repository:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bash:--&lt;br&gt;
git clone &lt;a href="https://github.com/codewithvishuuu/murf-livekit-starter.git" rel="noopener noreferrer"&gt;https://github.com/codewithvishuuu/murf-livekit-starter.git&lt;/a&gt;&lt;br&gt;
cd murf-livekit-starter&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝗖𝗼𝗻𝗳𝗶𝗴𝘂𝗿𝗲 𝗔𝗣𝗜 𝗞𝗲𝘆𝘀
API keys should never be hardcoded into the source code or committed to GitHub.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Store them in the project's local environment file, such as .env.local, according to the variables required by the project.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝗙𝗼𝗿 𝗲𝘅𝗮𝗺𝗽𝗹𝗲:
GOOGLE_API_KEY=your_key_here&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use your actual keys only in your local environment.&lt;/p&gt;

&lt;p&gt;Make sure .env.local is included in .gitignore and never publish the file containing real credentials.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;𝗦𝘁𝗮𝗿𝘁 𝘁𝗵𝗲 𝗟𝗼𝗰𝗮𝗹 𝗟𝗶𝘃𝗲𝗞𝗶𝘁 𝗦𝗲𝗿𝘃𝗲𝗿&lt;br&gt;
If you are running LiveKit locally, start the local LiveKit server first. The backend agent connects to this server for the real-time voice session.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;𝗙𝗼𝗿 𝗲𝘅𝗮𝗺𝗽𝗹𝗲:&lt;br&gt;
cd backend&lt;br&gt;
uv run python src/agent.py dev&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then start the frontend...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;𝗦𝘁𝗮𝗿𝘁 𝘁𝗵𝗲 𝗕𝗮𝗰𝗸𝗲𝗻𝗱 𝗔𝗴𝗲𝗻𝘁&lt;br&gt;
cd backend&lt;br&gt;
uv run python src/agent.py dev&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;𝗦𝘁𝗮𝗿𝘁 𝘁𝗵𝗲 𝗙𝗿𝗼𝗻𝘁𝗲𝗻𝗱&lt;br&gt;
Then start the frontend using the project's frontend development command.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open the local application in your browser and start a conversation.&lt;/p&gt;

&lt;p&gt;𝐓𝐞𝐬𝐭𝐢𝐧𝐠 𝐭𝐡𝐞 𝐂𝐨𝐧𝐯𝐞𝐫𝐬𝐚𝐭𝐢𝐨𝐧:&lt;/p&gt;

&lt;p&gt;A simple test flow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start the application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select English or Hindi.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ask a normal health or wellness question.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ask for a clinic appointment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verify that the main agent announces the specialist handoff.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Continue the appointment conversation with the specialist.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ask for a general wellness topic and verify the specialist can hand the conversation back.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test the Human Support flow and verify that a reference ID is generated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the Call Analytics Dashboard after completing calls.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Schedule a reminder using a natural-language request, such as "Remind me in 5 minutes to drink water."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verify that a unique reminder reference ID is generated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open the Scheduled Reminders page and check the reminder status.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a pending reminder and verify that it can be cancelled.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leave a reminder active and verify that the scheduled outbound call is triggered at the requested time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verify that the same reminder is not triggered more than once.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This type of testing helped me verify the actual user journey across voice conversations, specialist handoffs, human support, scheduled reminders, and call analytics instead of relying only on automated tests.&lt;/p&gt;

&lt;p&gt;𝗺𝗮𝗿𝗸𝗱𝗼𝘄𝗻&lt;br&gt;
𝟕. 𝐖𝐡𝐚𝐭 𝐈 𝐖𝐨𝐮𝐥𝐝 𝐈𝐦𝐩𝐫𝐨𝐯𝐞 𝐍𝐞𝐱𝐭:&lt;/p&gt;

&lt;p&gt;There are still several things I would like to improve.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;𝗕𝗲𝘁𝘁𝗲𝗿 𝗔𝗽𝗽𝗼𝗶𝗻𝘁𝗺𝗲𝗻𝘁 𝗜𝗻𝘁𝗲𝗴𝗿𝗮𝘁𝗶𝗼𝗻&lt;br&gt;
The current specialist focuses on appointment guidance and preparation. A future version could integrate real clinic availability and appointment booking instead of only guiding the user through the process.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;𝗠𝗼𝗿𝗲 𝗟𝗮𝗻𝗴𝘂𝗮𝗴𝗲 𝗦𝘂𝗽𝗽𝗼𝗿𝘁&lt;br&gt;
The current language-selection flow focuses on English and Hindi. More Indian languages could be added while keeping the same strict native-script approach.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;𝗕𝗲𝘁𝘁𝗲𝗿 𝗢𝗯𝘀𝗲𝗿𝘃𝗮𝗯𝗶𝗹𝗶𝘁𝘆&lt;br&gt;
The analytics dashboard could be expanded with more operational metrics such as latency, handoff rates, tool usage, and failure reasons.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;𝗠𝗼𝗿𝗲 𝗥𝗼𝗯𝘂𝘀𝘁 𝗧𝗲𝘀𝘁𝗶𝗻𝗴&lt;br&gt;
I would also like to expand automated behavioral testing with more real-world conversation scenarios and improve testing around external inference-service failures.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;𝗠𝗼𝗿𝗲 𝗔𝗱𝘃𝗮𝗻𝗰𝗲𝗱 𝗥𝗲𝗺𝗶𝗻𝗱𝗲𝗿 𝗪𝗼𝗿𝗸𝗳𝗹𝗼𝘄𝘀&lt;br&gt;
The current reminder system supports natural-language scheduling, status tracking, cancellation, and outbound reminder calls. A future version could support recurring reminders, richer scheduling options, user-configurable reminder preferences, and more advanced delivery controls.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;𝗠𝗼𝗿𝗲 𝗦𝗽𝗲𝗰𝗶𝗮𝗹𝗶𝘀𝘁 𝗔𝗴𝗲𝗻𝘁𝘀&lt;br&gt;
The same architecture could support additional focused agents, such as a pharmacy information specialist or a health-services navigation specialist, while keeping the main agent responsible for routing.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;𝟖. 𝐋𝐢𝐧𝐤𝐬 𝐭𝐨 𝐭𝐡𝐞 𝐂𝐨𝐝𝐞 𝐚𝐧𝐝 𝐃𝐞𝐦𝐨:&lt;/p&gt;

&lt;p&gt;The project is open for others to explore and learn from.&lt;/p&gt;

&lt;p&gt;𝗚𝗶𝘁𝗛𝘂𝗯 𝗥𝗲𝗽𝗼𝘀𝗶𝘁𝗼𝗿𝘆:&lt;br&gt;
&lt;a href="https://github.com/codewithvishuuu/murf-livekit-starter" rel="noopener noreferrer"&gt;https://github.com/codewithvishuuu/murf-livekit-starter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository contains the agent implementation, prompts, specialist handoff logic, scheduled reminder calls, tests, frontend, analytics, wellness tips, and support flows.&lt;/p&gt;

&lt;p&gt;I also recommend looking at the project structure and tests if you are building your own voice agent. The tests were especially useful for checking routing, safety rules, handoffs, handbacks, language behavior, and privacy boundaries.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;𝐅𝐢𝐧𝐚𝐥 𝐓𝐡𝐨𝐮𝐠𝐡𝐭𝐬:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Building Aarogya Sahayak over these 10 days taught me that a useful voice agent is much more than connecting an LLM to speech.&lt;/p&gt;

&lt;p&gt;The difficult part is designing the system around the model: defining clear responsibilities, creating safety boundaries, routing conversations to the right agent, preserving context, protecting user information, and measuring whether the system actually works.&lt;/p&gt;

&lt;p&gt;As the project evolved, I also learned how features such as scheduled reminder calls and accessible wellness guidance can extend a voice agent beyond a single conversation while still keeping safety and privacy at the center.&lt;/p&gt;

&lt;p&gt;The biggest lesson I learned is that a good voice agent should know not only "how to answer", but also "when not to answer itself".&lt;/p&gt;

&lt;p&gt;That is where tools, specialist agents, analytics, scheduled workflows, and human support become important.&lt;/p&gt;

&lt;p&gt;I'm grateful to "&lt;a href="https://murf.ai/" rel="noopener noreferrer"&gt;Murf AI&lt;/a&gt;" for organizing the "10 Days of Voice Agents — #VoiceForBharat Edition" and giving me the opportunity to build, test, break, fix, and improve a real voice-agent project.&lt;/p&gt;

&lt;p&gt;I'm building voice agents using the fastest TTS API — "&lt;a href="https://murf.ai/blog/on-premise" rel="noopener noreferrer"&gt;Murf Falcon&lt;/a&gt;".&lt;/p&gt;

&lt;p&gt;Have you experimented with real-time voice pipelines or &lt;a href="https://livekit.com/" rel="noopener noreferrer"&gt;LiveKit&lt;/a&gt;integrations yet?🛠️ What’s the biggest latency hurdle you’ve run into? Drop your thoughts in the comments below!👇💬&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;𝙏𝙝𝙖𝙣𝙠 𝙮𝙤𝙪 𝙛𝙤𝙧 𝙧𝙚𝙖𝙙𝙞𝙣𝙜! 𝙁𝙚𝙚𝙡 𝙛𝙧𝙚𝙚 𝙩𝙤 𝙧𝙚𝙖𝙘𝙝 𝙤𝙪𝙩 𝙤𝙧 𝙘𝙤𝙣𝙣𝙚𝙘𝙩 𝙤𝙣 &lt;a href="https://www.linkedin.com/in/vishal-kumar-805248335/?skipRedirect=true" rel="noopener noreferrer"&gt;𝙇𝙞𝙣𝙠𝙚𝙙𝙄𝙣&lt;/a&gt; / &lt;a href="https://github.com/codewithvishuuu" rel="noopener noreferrer"&gt;𝙂𝙞𝙩𝙃𝙪𝙗&lt;/a&gt;🤝&lt;br&gt;
𝑽𝒊𝒔𝒉𝒂𝒍 𝑲𝒖𝒎𝒂𝒓💖&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>voiceai</category>
      <category>voiceforbharat</category>
    </item>
    <item>
      <title>How I Turned an Old Movie Recommendation Project Into a Cinematic AI Platform</title>
      <dc:creator>Vishal Kumar</dc:creator>
      <pubDate>Sun, 24 May 2026 16:35:48 +0000</pubDate>
      <link>https://dev.to/vvisshuuu2500/how-i-turned-an-old-movie-recommendation-project-into-a-cinematic-ai-platform-152j</link>
      <guid>https://dev.to/vvisshuuu2500/how-i-turned-an-old-movie-recommendation-project-into-a-cinematic-ai-platform-152j</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%2F8mrtdd9eivzlgtpwx4dz.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%2F8mrtdd9eivzlgtpwx4dz.png" alt=" " width="800" height="394"&gt;&lt;/a&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;h1&gt;
  
  
  What I Built
&lt;/h1&gt;

&lt;p&gt;I built CineMatch, an AI-powered movie recommendation platform designed with a cinematic Netflix-inspired interface.&lt;/p&gt;

&lt;p&gt;The project started as a small recommendation engine, but during this challenge I focused on transforming it into a much more polished and immersive experience. I redesigned the UI, improved the recommendation logic, added responsive layouts, integrated TMDB live metadata, and reorganized the project architecture into modular components.&lt;/p&gt;

&lt;p&gt;The platform uses TF-IDF vectorization and cosine similarity to recommend movies based on storyline similarity instead of only genres.&lt;/p&gt;

&lt;p&gt;Some major features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI-powered semantic movie recommendations&lt;/li&gt;
&lt;li&gt;Typo-correcting search system&lt;/li&gt;
&lt;li&gt;Live TMDB integration&lt;/li&gt;
&lt;li&gt;Dynamic spotlight movie banners&lt;/li&gt;
&lt;li&gt;Responsive mobile-first layouts&lt;/li&gt;
&lt;li&gt;Personalized watchlist system&lt;/li&gt;
&lt;li&gt;Glassmorphism cinematic UI&lt;/li&gt;
&lt;li&gt;Mood-based recommendation steering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The app currently works with a local database of more than 45,000 movies.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Live Demo
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cinematch-movie-recommender-bqzsppgvepmahksda8qxg9.streamlit.app/" rel="noopener noreferrer"&gt;https://cinematch-movie-recommender-bqzsppgvepmahksda8qxg9.streamlit.app/&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/codewithvishuuu/cinematch-movie-recommender" rel="noopener noreferrer"&gt;https://github.com/codewithvishuuu/cinematch-movie-recommender&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Home Landing&lt;/th&gt;
&lt;th&gt;AI Matcher&lt;/th&gt;
&lt;th&gt;Responsive Layout&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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%2Ffy1gzpgncphmf5zvy22w.png" alt="Home" width="800" height="394"&gt;&lt;/td&gt;
&lt;td&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%2F4qs3gknl6qtt8a4hgxgr.png" alt="AI" width="799" height="462"&gt;&lt;/td&gt;
&lt;td&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%2Fjub7awi03qx182rs8byh.png" alt="Responsive" width="799" height="459"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;Originally this project was a very simple recommendation prototype with basic UI and minimal functionality.&lt;/p&gt;

&lt;p&gt;During the challenge I completely reworked large parts of the project. I reorganized the structure into modular folders, improved the frontend design, added reusable UI components, optimized mobile responsiveness, and connected live TMDB APIs for trailers and metadata.&lt;/p&gt;

&lt;p&gt;One of the biggest improvements was making the interface work properly on smaller screens. Earlier many sections broke on mobile devices, especially buttons, grids, and text layouts. I redesigned the layouts using responsive spacing, adaptive sizing, and flexible containers.&lt;/p&gt;

&lt;p&gt;I also improved the recommendation engine by adding better search handling, typo correction, and mood-based filtering.&lt;/p&gt;

&lt;p&gt;The final result feels much more like a complete product instead of just a small ML experiment.&lt;/p&gt;

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

&lt;p&gt;GitHub Copilot helped me speed up repetitive development tasks and UI restructuring.&lt;/p&gt;

&lt;p&gt;I mainly used it while:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reorganizing components&lt;/li&gt;
&lt;li&gt;improving responsive CSS&lt;/li&gt;
&lt;li&gt;generating repetitive layout sections&lt;/li&gt;
&lt;li&gt;refactoring utility logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It helped reduce development time, especially during UI polishing and architecture cleanup, while I still manually customized the recommendation logic and overall design decisions.&lt;/p&gt;

&lt;p&gt;Overall this challenge helped me improve both my frontend design skills and project organization workflow.&lt;/p&gt;

</description>
      <category>githubchallenge</category>
      <category>ai</category>
      <category>webdev</category>
      <category>python</category>
    </item>
  </channel>
</rss>
