<?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: Allenki Sathyendra</title>
    <description>The latest articles on DEV Community by Allenki Sathyendra (@allenkisathya).</description>
    <link>https://dev.to/allenkisathya</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%2F4078653%2Fd0e31262-7263-4ac8-a49f-c632505d8640.jpg</url>
      <title>DEV Community: Allenki Sathyendra</title>
      <link>https://dev.to/allenkisathya</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/allenkisathya"/>
    <language>en</language>
    <item>
      <title>Building JanMitra: My 10-Day Journey Building a Multilingual Healthcare Voice Agent for Bharat</title>
      <dc:creator>Allenki Sathyendra</dc:creator>
      <pubDate>Sat, 15 Aug 2026 13:16:37 +0000</pubDate>
      <link>https://dev.to/allenkisathya/building-janmitra-my-10-day-journey-building-a-multilingual-healthcare-voice-agent-for-bharat-3ecf</link>
      <guid>https://dev.to/allenkisathya/building-janmitra-my-10-day-journey-building-a-multilingual-healthcare-voice-agent-for-bharat-3ecf</guid>
      <description>&lt;h1&gt;
  
  
  Building JanMitra: A Voice for Better Health Access — My 10-Day VoiceForBharat Journey
&lt;/h1&gt;

&lt;p&gt;What if accessing basic healthcare information was as simple as having a conversation?&lt;/p&gt;

&lt;p&gt;That question became the starting point for &lt;strong&gt;JanMitra (जनमित्र)&lt;/strong&gt; — a multilingual healthcare voice assistant I built during the &lt;strong&gt;10 Days of Voice Agents — VoiceForBharat Edition&lt;/strong&gt; challenge by Murf AI.&lt;/p&gt;

&lt;p&gt;I didn't want to build another chatbot where users type questions into a box.&lt;/p&gt;

&lt;p&gt;I wanted to explore something more natural:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What if people could simply talk to an AI assistant in the language they are comfortable with and get guidance about healthcare access?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Over ten days, JanMitra evolved from a basic voice agent into a complete conversational system with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time voice conversations&lt;/li&gt;
&lt;li&gt;Multilingual and code-mixed interaction&lt;/li&gt;
&lt;li&gt;Healthcare safety guardrails&lt;/li&gt;
&lt;li&gt;Consent-based persistent memory&lt;/li&gt;
&lt;li&gt;Healthcare-access tools&lt;/li&gt;
&lt;li&gt;Health-camp information&lt;/li&gt;
&lt;li&gt;Outbound calling&lt;/li&gt;
&lt;li&gt;Human escalation&lt;/li&gt;
&lt;li&gt;Call analytics&lt;/li&gt;
&lt;li&gt;Clinic and appointment specialist handoff&lt;/li&gt;
&lt;li&gt;Conversation-context preservation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And getting there wasn't easy.&lt;/p&gt;

&lt;p&gt;I faced silent voice sessions, extremely high response latency, database bottlenecks, interrupted audio, and regression risk every time I added something new.&lt;/p&gt;

&lt;p&gt;This article is the story of what I built, what broke, how I fixed it, and what I learned while building a real-time voice AI system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Meet JanMitra
&lt;/h2&gt;

&lt;p&gt;![JanMitra welcome screen — Aapka Swasthya Saathi]&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%2Fc4hg1a582lh7gcw5dpow.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%2Fc4hg1a582lh7gcw5dpow.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;JanMitra's welcome screen — PM-JAY &amp;amp; Ayushman Bharat guidance, PHC/CHC/hospital discovery, and the "Speak Naturally" language chips (Hindi, Telugu, Tamil, Malayalam, Bengali, Marathi, Kannada).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JanMitra (जनमित्र)&lt;/strong&gt; represents the idea of a friend or companion for people.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Aapka Swasthya Saathi — Your Healthcare Companion&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;JanMitra is designed to help users access general healthcare information and healthcare services through natural voice conversations.&lt;/p&gt;

&lt;p&gt;It is &lt;strong&gt;not a doctor&lt;/strong&gt; and is not designed to replace medical professionals.&lt;/p&gt;

&lt;p&gt;Its role is to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provide general healthcare information&lt;/li&gt;
&lt;li&gt;Guide users toward appropriate healthcare services&lt;/li&gt;
&lt;li&gt;Provide health-camp information&lt;/li&gt;
&lt;li&gt;Support multilingual conversations&lt;/li&gt;
&lt;li&gt;Remember returning users with consent&lt;/li&gt;
&lt;li&gt;Escalate when human assistance is needed&lt;/li&gt;
&lt;li&gt;Route appointment-related conversations to a specialist workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't to replace healthcare professionals with AI.&lt;/p&gt;

&lt;p&gt;The goal is to make &lt;strong&gt;access to healthcare information easier through conversation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The welcome screen reflects that directly: JanMitra's name in both scripts, the tagline underneath, quick pointers to PM-JAY &amp;amp; Ayushman Bharat guidance and PHC/CHC/hospital discovery, and a row of language chips — Hindi, Telugu, Tamil, Malayalam, Bengali, Marathi, Kannada — inviting the caller to just speak naturally. One button: &lt;strong&gt;JanMitra से बात करें | Start Talking.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Build a Voice-First Healthcare Assistant?
&lt;/h2&gt;

&lt;p&gt;Healthcare information can sometimes be difficult to access.&lt;/p&gt;

&lt;p&gt;A person may want to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where can I find healthcare services?&lt;/li&gt;
&lt;li&gt;Is there a health camp available?&lt;/li&gt;
&lt;li&gt;How can I approach a clinic?&lt;/li&gt;
&lt;li&gt;When should I seek professional medical attention?&lt;/li&gt;
&lt;li&gt;Can I get help with an appointment?&lt;/li&gt;
&lt;li&gt;Can I communicate in my preferred Indian language?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For many people, speaking can be more natural than typing.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Open website
    ↓
Find the required section
    ↓
Type a question
    ↓
Read the answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The experience becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Open JanMitra
    ↓
Start talking
    ↓
Get guidance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That difference became the core motivation behind the project.&lt;/p&gt;




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

&lt;p&gt;By the end of the challenge, JanMitra had evolved into a multi-component voice AI system.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Voice conversation&lt;/td&gt;
&lt;td&gt;Enables real-time spoken interaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multilingual support&lt;/td&gt;
&lt;td&gt;Handles multilingual and code-mixed conversations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safety guardrails&lt;/td&gt;
&lt;td&gt;Keeps healthcare responses within safe boundaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;Remembers permitted user information&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Healthcare tools&lt;/td&gt;
&lt;td&gt;Provides healthcare-access functionality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Health camps&lt;/td&gt;
&lt;td&gt;Provides available health-camp information&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outbound calling&lt;/td&gt;
&lt;td&gt;Supports outbound healthcare communication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human escalation&lt;/td&gt;
&lt;td&gt;Transfers situations requiring human assistance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analytics&lt;/td&gt;
&lt;td&gt;Tracks call-related outcomes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Specialist agent&lt;/td&gt;
&lt;td&gt;Handles clinic and appointment enquiries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context preservation&lt;/td&gt;
&lt;td&gt;Prevents users from repeating their request&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each feature introduced a new engineering challenge. That is what made the project interesting.&lt;/p&gt;




&lt;h1&gt;
  
  
  Technology Stack
&lt;/h1&gt;

&lt;p&gt;JanMitra combines several technologies into one real-time voice pipeline.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Real-time transport&lt;/td&gt;
&lt;td&gt;LiveKit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voice agent runtime&lt;/td&gt;
&lt;td&gt;LiveKit Agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speech-to-Text&lt;/td&gt;
&lt;td&gt;Deepgram Nova-3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language Model&lt;/td&gt;
&lt;td&gt;OpenRouter (&lt;code&gt;meta-llama/llama-3.3-70b-instruct&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Text-to-Speech&lt;/td&gt;
&lt;td&gt;Murf Falcon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voice Activity Detection&lt;/td&gt;
&lt;td&gt;Silero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistent memory&lt;/td&gt;
&lt;td&gt;SQLite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;Next.js / React&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testing&lt;/td&gt;
&lt;td&gt;pytest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The LLM layer didn't start on OpenRouter. Earlier development used a Google Gemini configuration, and that history is still visible in the repository — &lt;code&gt;test_gemini.py&lt;/code&gt; remains part of the test suite. The move to OpenRouter and Llama 3.3 70B was a later decision, not the starting point, and I've kept the earlier test rather than pretending Gemini was never part of the project.&lt;/p&gt;

&lt;p&gt;The interesting part isn't any individual API. The challenge is making all of these components work together &lt;strong&gt;in real time&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  System Architecture
&lt;/h1&gt;

&lt;p&gt;The high-level JanMitra architecture looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                         ┌──────────────────┐
                         │       USER       │
                         └────────┬─────────┘
                                  │
                             Voice Input
                                  │
                                  ▼
                         ┌──────────────────┐
                         │     LiveKit      │
                         │ Real-time Audio  │
                         └────────┬─────────┘
                                  │
                                  ▼
                         ┌──────────────────┐
                         │  Deepgram STT    │
                         │   Nova-3         │
                         └────────┬─────────┘
                                  │
                                  ▼
                         ┌──────────────────┐
                         │   OpenRouter     │
                         │       LLM        │
                         └────────┬─────────┘
                                  │
             ┌────────────────────┼────────────────────┐
             │                    │                    │
             ▼                    ▼                    ▼
      ┌────────────┐       ┌────────────┐      ┌──────────────┐
      │   Memory   │       │ Healthcare │      │  Specialist  │
      │   SQLite   │       │   Tools    │      │    Agent     │
      └────────────┘       └────────────┘      └──────────────┘
             │                    │                    │
             └────────────────────┼────────────────────┘
                                  │
                                  ▼
                         ┌──────────────────┐
                         │   Murf Falcon    │
                         │       TTS        │
                         └────────┬─────────┘
                                  │
                           Voice Response
                                  │
                                  ▼
                         ┌──────────────────┐
                         │       USER       │
                         └──────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This architecture separates the major responsibilities while keeping the interaction real-time.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Voice Pipeline
&lt;/h1&gt;

&lt;p&gt;A typical JanMitra conversation follows this sequence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User speaks
    ↓
LiveKit receives audio
    ↓
Deepgram converts speech to text
    ↓
OpenRouter generates the response
    ↓
Tools/memory/specialist workflows are invoked when required
    ↓
Murf Falcon converts the response into speech
    ↓
LiveKit publishes the audio
    ↓
User hears JanMitra
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This looks simple on paper. In practice, every arrow can become a failure point.&lt;/p&gt;




&lt;h1&gt;
  
  
  Feature 1 — Natural Voice with Murf Falcon
&lt;/h1&gt;

&lt;p&gt;One of the most important parts of JanMitra is its voice experience.&lt;/p&gt;

&lt;p&gt;I didn't want the system to feel like a text chatbot that simply reads answers aloud. I wanted the interaction to feel conversational.&lt;/p&gt;

&lt;p&gt;The voice path is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Speech
     ↓
Deepgram STT
     ↓
LLM Reasoning
     ↓
Murf Falcon
     ↓
Spoken Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Murf Falcon became the text-to-speech layer of JanMitra.&lt;/p&gt;

&lt;p&gt;But integrating TTS taught me an important lesson:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A fast LLM alone does not create a fast voice agent.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the database blocks the event loop, the conversation slows down. If TTS playout is interrupted, the user hears incomplete audio. If the browser doesn't receive the published audio correctly, the generated response never reaches the user.&lt;/p&gt;

&lt;p&gt;Voice AI is a complete pipeline. Every layer matters.&lt;/p&gt;

&lt;p&gt;![JanMitra mid-conversation — live transcript and status]&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%2Fn4n2i0qf8jkkfhrh8aq0.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%2Fn4n2i0qf8jkkfhrh8aq0.png" alt=" " width="799" height="359"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;JanMitra mid-conversation — live transcript, "Listening to you..." status, and the text fallback input for anyone who'd rather type.&lt;/em&gt;&lt;/p&gt;


&lt;h1&gt;
  
  
  Feature 2 — Multilingual Conversations
&lt;/h1&gt;

&lt;p&gt;India is multilingual. So JanMitra wasn't designed around a single-language interaction.&lt;/p&gt;

&lt;p&gt;The system is designed to support multilingual and code-mixed conversations. English, Hindi, and Telugu got the most hands-on testing during development; the welcome screen also surfaces Tamil, Malayalam, Bengali, Marathi, and Kannada as options, though I'd trust the Hindi and Telugu experience most today since that's where most of the real conversational testing happened.&lt;/p&gt;

&lt;p&gt;For example, a user can ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Please explain this in Hindi."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or use a code-mixed request such as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Telugu lo cheppandi." (&lt;em&gt;"Please say it in Telugu."&lt;/em&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The objective isn't simply translation. The objective is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Let the user communicate naturally.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h1&gt;
  
  
  Feature 3 — Consent-Based Persistent Memory
&lt;/h1&gt;

&lt;p&gt;A returning user shouldn't always have to start from zero.&lt;/p&gt;

&lt;p&gt;JanMitra includes persistent caller memory using SQLite.&lt;/p&gt;

&lt;p&gt;The memory workflow supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caller identification&lt;/li&gt;
&lt;li&gt;Memory lookup&lt;/li&gt;
&lt;li&gt;Saving permitted information&lt;/li&gt;
&lt;li&gt;Returning-user recognition&lt;/li&gt;
&lt;li&gt;Forget-me functionality&lt;/li&gt;
&lt;li&gt;Explicit consent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The intended flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User provides information
          ↓
JanMitra asks for permission
          ↓
User agrees
          ↓
Information is stored
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the user doesn't provide permission, the information should not be stored. This made memory more than a database feature. It became a &lt;strong&gt;privacy-aware conversational feature&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Feature 4 — Healthcare Safety Guardrails
&lt;/h1&gt;

&lt;p&gt;Healthcare is a sensitive domain. An AI assistant should not confidently pretend to be a doctor.&lt;/p&gt;

&lt;p&gt;JanMitra is therefore designed to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provide general healthcare information&lt;/li&gt;
&lt;li&gt;Provide supportive guidance where appropriate&lt;/li&gt;
&lt;li&gt;Provide healthcare-access information&lt;/li&gt;
&lt;li&gt;Encourage professional care when necessary&lt;/li&gt;
&lt;li&gt;Avoid pretending to diagnose&lt;/li&gt;
&lt;li&gt;Avoid inappropriate medication prescribing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The guiding principle is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI can assist. Healthcare professionals remain responsible for medical care.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When professional evaluation is required, JanMitra should guide the user toward an appropriate healthcare facility rather than attempting to replace medical care.&lt;/p&gt;




&lt;h1&gt;
  
  
  Feature 5 — Health Camp Information
&lt;/h1&gt;

&lt;p&gt;Healthcare access isn't only about symptoms. Sometimes the most useful question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Where and when can I get healthcare services?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;JanMitra includes health-camp functionality so the assistant can provide available health-camp information rather than relying entirely on generated responses.&lt;/p&gt;

&lt;p&gt;This functionality also connects naturally with outbound communication.&lt;/p&gt;




&lt;h1&gt;
  
  
  Feature 6 — Outbound Calling
&lt;/h1&gt;

&lt;p&gt;JanMitra isn't limited to waiting for users to open the application.&lt;/p&gt;

&lt;p&gt;The project also includes an outbound calling workflow. One use case is communicating health-camp information.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Healthcare Information
          ↓
       JanMitra
          ↓
     Outbound Call
          ↓
        User
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This changed how I thought about voice agents. A voice agent doesn't have to be only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Ask me something."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It can also become:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"I'll reach you when useful information is available."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Feature 7 — Human Escalation
&lt;/h1&gt;

&lt;p&gt;AI shouldn't try to solve every problem. Especially in healthcare.&lt;/p&gt;

&lt;p&gt;JanMitra includes a human escalation workflow. When human assistance is required, the system can create an escalation request with a reference ID rather than forcing the AI to continue beyond its role.&lt;/p&gt;

&lt;p&gt;The philosophy is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI should help when it can and escalate when it should.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This became one of the most important safety principles in the project.&lt;/p&gt;




&lt;h1&gt;
  
  
  Feature 8 — Call Analytics Dashboard
&lt;/h1&gt;

&lt;p&gt;Building the voice agent was only half the problem. I also wanted to understand what happened during conversations, so I built a call analytics dashboard that records call-related outcomes and surfaces them on the frontend.&lt;/p&gt;

&lt;p&gt;The lesson here wasn't about a specific dashboard bug — it was more general:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A feature isn't finished just because the UI exists.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The data behind the UI has to be trustworthy too, which is part of why analytics ended up going through the same regression testing as everything else.&lt;/p&gt;




&lt;h1&gt;
  
  
  Feature 9 — Clinic &amp;amp; Appointment Specialist
&lt;/h1&gt;

&lt;p&gt;This became one of my favourite architectural improvements.&lt;/p&gt;

&lt;p&gt;A single AI agent shouldn't have to handle every responsibility. So I created a dedicated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ClinicAppointmentSpecialist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Its responsibility is focused on clinic and appointment-related enquiries. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User:
"I want to book an appointment for a general health check-up."

Main JanMitra:
"I'll connect you to our clinic and appointment specialist."

                ↓

ClinicAppointmentSpecialist

                ↓

Continues the conversation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is that the user does not need to repeat the request. The specialist continues with the relevant conversation context.&lt;/p&gt;




&lt;h1&gt;
  
  
  Feature 10 — Context-Preserving Handoff
&lt;/h1&gt;

&lt;p&gt;A handoff is not useful if the user has to explain everything again.&lt;/p&gt;

&lt;p&gt;The intended experience is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User asks appointment question
            ↓
Main JanMitra understands request
            ↓
Handoff announcement
            ↓
ClinicAppointmentSpecialist
            ↓
Specialist continues with context
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the architecture more modular and provides a foundation for adding additional specialist agents later.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Handoff Implementation
&lt;/h1&gt;

&lt;p&gt;The main agent uses a dedicated handoff tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;transfer_to_clinic_specialist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Conceptually, the session transitions to the specialist while the existing conversation context remains available to the session.&lt;/p&gt;

&lt;p&gt;The key idea is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Main Agent
    ↓
Identify specialist need
    ↓
Announce handoff
    ↓
Complete speech playout
    ↓
Transfer control
    ↓
Specialist introduction
    ↓
Continue conversation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The "complete speech playout" step wasn't there from the start — it's the fix for a real bug, covered next.&lt;/p&gt;

&lt;p&gt;The user experiences one continuous conversation rather than starting a new conversation from scratch.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Problems That Almost Broke JanMitra
&lt;/h1&gt;

&lt;p&gt;The final result looks clean. The development process wasn't. Some of the most valuable lessons came from failures.&lt;/p&gt;




&lt;h2&gt;
  
  
  Challenge 1 — Two Different 45-Second Delays
&lt;/h2&gt;

&lt;p&gt;At two separate points in development, JanMitra ended up taking around &lt;strong&gt;45 seconds&lt;/strong&gt; to respond. For a voice assistant, that's effectively broken — but the two incidents had different root causes, and it's worth keeping them separate rather than telling it as one bug.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The first time&lt;/strong&gt;, the cause was an invalid tool schema — a Python tool definition (using a union type for one parameter, plus a couple of zero-argument tools) that generated JSON the LLM provider rejected. Retries stacked up and the delay ballooned. The fix was to simplify the tool signatures to explicit, valid types.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The second time&lt;/strong&gt;, later on, once more database operations had accumulated (&lt;code&gt;get_user&lt;/code&gt;, &lt;code&gt;save_user&lt;/code&gt;, &lt;code&gt;delete_user&lt;/code&gt;, &lt;code&gt;save_escalation&lt;/code&gt;, &lt;code&gt;record_call_analytics&lt;/code&gt;), I traced the delay to synchronous SQLite calls running directly on the main asyncio event loop — meaning disk I/O could stall LiveKit's voice-activity detection and turn detection at the same time. A warning made this visible directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;turn detection transport latency is too high: 4213ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fix was to move blocking database operations into background threads:&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;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_thread&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that fix, turn detection latency dropped to roughly &lt;strong&gt;12ms&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The lesson:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Latency isn't always an LLM problem — and it isn't always the &lt;em&gt;same&lt;/em&gt; problem twice, either.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Challenge 2 — The Agent Joined but Didn't Speak
&lt;/h2&gt;

&lt;p&gt;This was one of the most frustrating bugs.&lt;/p&gt;

&lt;p&gt;The browser connected. The LiveKit room existed. The agent appeared to join. But there was no voice.&lt;/p&gt;

&lt;p&gt;I checked browser volume, microphone, speaker, audio permissions — everything looked fine. So I traced the complete lifecycle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
   ↓
LiveKit Room
   ↓
Agent Joins
   ↓
Session Starts
   ↓
Greeting Generation
   ↓
Murf TTS
   ↓
Audio Publication
   ↓
Browser Subscription
   ↓
Audio Playback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few distinct issues turned out to be contributing to this at different points: &lt;code&gt;session.start()&lt;/code&gt; was being awaited synchronously in a way that blocked the greeting code from running until the call ended; a Deepgram configuration using &lt;code&gt;language="multi"&lt;/code&gt; was causing the STT WebSocket connection to be rejected outright, silently dropping incoming speech; and a token route that generated a fresh random room name (&lt;code&gt;voice_assistant_room_${Math.random()}&lt;/code&gt;) on every request could cause the client to disconnect from one room and try to join another mid-session.&lt;/p&gt;

&lt;p&gt;The lesson:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A successful room connection does not mean a successful voice conversation.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For voice systems, the complete audio lifecycle must be verified — and "silence" can have more than one cause hiding behind it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Challenge 3 — Handoff Audio Was Being Cut Off
&lt;/h2&gt;

&lt;p&gt;During the specialist handoff, another problem appeared.&lt;/p&gt;

&lt;p&gt;The main agent would say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I'll connect you to our clinic and appointment specialist."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and then immediately switch control. The announcement could be interrupted mid-sentence.&lt;/p&gt;

&lt;p&gt;The correct sequence needed to be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Main Agent
    ↓
Speak handoff announcement
    ↓
Wait for audio playout
    ↓
Switch active agent
    ↓
Specialist introduction
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fix was to explicitly wait for playout before switching agent state:&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;await&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait_for_playout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The lesson:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Don't switch conversational control while the previous agent is still speaking.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Challenge 4 — MongoDB vs SQLite
&lt;/h2&gt;

&lt;p&gt;For persistent memory, I initially explored MongoDB. While working with MongoDB Atlas, I encountered TLS/SSL connectivity issues during the handshake.&lt;/p&gt;

&lt;p&gt;Instead of adding more infrastructure, I stepped back and asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Do I actually need a remote database for this challenge?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For this project, SQLite was sufficient. So I moved the persistent memory system to SQLite. That simplified local development, debugging, database access, testing, and project setup.&lt;/p&gt;

&lt;p&gt;One of my favourite lessons was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sometimes good engineering means removing infrastructure instead of adding it.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Challenge 5 — Keeping Everything Working
&lt;/h2&gt;

&lt;p&gt;The hardest part wasn't adding the first feature. It was adding the tenth feature without breaking the first.&lt;/p&gt;

&lt;p&gt;The system eventually contained:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Voice
  ↓
Multilingual Interaction
  ↓
Memory
  ↓
Healthcare Tools
  ↓
Health Camps
  ↓
Outbound Calling
  ↓
Human Escalation
  ↓
Analytics
  ↓
Specialist Handoff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A change in one component could affect another. That made regression testing increasingly important.&lt;/p&gt;




&lt;h1&gt;
  
  
  Testing
&lt;/h1&gt;

&lt;p&gt;Before preparing the repository for public release, I updated outdated automated tests to match the current agent interface — the &lt;code&gt;Assistant&lt;/code&gt; class had grown a &lt;code&gt;user_id&lt;/code&gt; and &lt;code&gt;ctx&lt;/code&gt; requirement in its constructor, so older tests were updated with a dummy test user and a mocked &lt;code&gt;JobContext&lt;/code&gt;, without changing what the tests actually asserted.&lt;/p&gt;

&lt;p&gt;The final local automated test result was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;32 / 32 tests passed&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The tests covered areas including agent behaviour, database operations, memory, consent, analytics, escalation, and specialist handoff.&lt;/p&gt;

&lt;p&gt;I also manually tested the major voice workflows. The objective wasn't simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The code runs."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"The complete system still works after everything has been combined."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Public Repository Structure
&lt;/h1&gt;

&lt;p&gt;The final repository was organized into a clean backend/frontend structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JanMitra/
│
├── backend/
│   ├── src/
│   │   ├── __init__.py
│   │   ├── agent.py
│   │   ├── database.py
│   │   └── outbound.py
│   │
│   ├── tests/
│   │   ├── test_agent.py
│   │   ├── test_agent_memory_flow.py
│   │   ├── test_analytics.py
│   │   ├── test_database.py
│   │   ├── test_day7.py
│   │   ├── test_day9_handoff.py
│   │   └── test_gemini.py
│   │
│   ├── .env.example
│   ├── pyproject.toml
│   └── README.md
│
├── frontend/
│   ├── app/
│   ├── components/
│   ├── .env.example
│   ├── package.json
│   └── README.md
│
├── .gitignore
├── README.md
└── start_app.*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Security Before Going Public
&lt;/h1&gt;

&lt;p&gt;Because JanMitra operates in a healthcare-related context, repository security was especially important.&lt;/p&gt;

&lt;p&gt;Before publishing the project, I verified that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No API keys were present in tracked source files&lt;/li&gt;
&lt;li&gt;No &lt;code&gt;.env.local&lt;/code&gt; file was committed&lt;/li&gt;
&lt;li&gt;No database files were committed&lt;/li&gt;
&lt;li&gt;No caller information was committed&lt;/li&gt;
&lt;li&gt;No phone numbers or private credentials were committed&lt;/li&gt;
&lt;li&gt;Environment examples contain placeholders&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.gitignore&lt;/code&gt; protects local secrets and generated files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The principle was simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Show the engineering without exposing private information.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  How to Run JanMitra
&lt;/h1&gt;

&lt;p&gt;The current project is primarily prepared as a &lt;strong&gt;local development project&lt;/strong&gt; rather than a publicly deployed production healthcare service.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Clone the repository
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/allenkisathya9723/murf-livekit-starter.git
&lt;span class="nb"&gt;cd &lt;/span&gt;murf-livekit-starter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Configure environment variables
&lt;/h2&gt;

&lt;p&gt;Use the provided examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;backend/.env.example
frontend/.env.example
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create your own local environment files and add your credentials. &lt;strong&gt;Never commit real API keys.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Install dependencies
&lt;/h2&gt;

&lt;p&gt;Install the backend dependencies according to the backend project configuration. Then install the frontend dependencies from the &lt;code&gt;frontend&lt;/code&gt; directory.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Start the application
&lt;/h2&gt;

&lt;p&gt;Start the LiveKit voice agent backend and the Next.js frontend using the project's local development setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Test the conversation
&lt;/h2&gt;

&lt;p&gt;Open the frontend and start a voice session.&lt;/p&gt;

&lt;p&gt;For the specialist workflow, try:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"I want to book an appointment for a general health check-up."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Expected flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Main JanMitra
      ↓
Handoff announcement
      ↓
ClinicAppointmentSpecialist
      ↓
Conversation continues
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;Before this challenge, I thought a voice agent was basically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Speech → AI → Speech
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now I know it is much more than that.&lt;/p&gt;

&lt;p&gt;A reliable voice agent involves speech recognition, language understanding, text-to-speech, real-time transport, turn detection, memory, tool calling, database design, safety, consent, analytics, human escalation, specialist workflows, testing, and security.&lt;/p&gt;

&lt;p&gt;Every component matters. A fast LLM doesn't help if your database blocks the event loop. A working TTS API doesn't help if audio playout gets interrupted. A specialist doesn't help if conversation context disappears. And a healthcare assistant isn't trustworthy if it confidently pretends to diagnose someone.&lt;/p&gt;

&lt;p&gt;That was probably my biggest lesson from these ten days.&lt;/p&gt;




&lt;h1&gt;
  
  
  Build → Break → Debug → Test → Improve
&lt;/h1&gt;

&lt;p&gt;If I had to summarize the entire challenge in five words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Build → Break → Debug → Test → Improve&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The most valuable moments weren't always when everything worked. They were when something completely failed and I had to figure out &lt;strong&gt;why&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The 45-second responses taught me about asynchronous architecture — twice, in two different ways. The silent agent taught me about real-time audio lifecycles. The handoff bug taught me about speech playout. The database problem taught me to question whether I actually needed additional infrastructure. Regression testing taught me that every new feature has a cost.&lt;/p&gt;

&lt;p&gt;That is what made this challenge much more than simply connecting APIs.&lt;/p&gt;




&lt;h1&gt;
  
  
  What I Would Build Next
&lt;/h1&gt;

&lt;p&gt;JanMitra is still a challenge project, so there is a lot more I would like to explore.&lt;/p&gt;

&lt;p&gt;Future improvements include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More regional Indian languages tested to the same depth as Hindi and Telugu&lt;/li&gt;
&lt;li&gt;Better healthcare information retrieval&lt;/li&gt;
&lt;li&gt;More robust clinic and appointment discovery&lt;/li&gt;
&lt;li&gt;Better emergency workflows&lt;/li&gt;
&lt;li&gt;Additional specialist agents&lt;/li&gt;
&lt;li&gt;Production-grade telephony&lt;/li&gt;
&lt;li&gt;Improved analytics and observability&lt;/li&gt;
&lt;li&gt;Retrieval-Augmented Generation&lt;/li&gt;
&lt;li&gt;Cloud deployment&lt;/li&gt;
&lt;li&gt;More extensive real-world testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The long-term goal is to move JanMitra from a challenge project toward something that could genuinely improve access to healthcare information.&lt;/p&gt;




&lt;h1&gt;
  
  
  Open Source Repository
&lt;/h1&gt;

&lt;p&gt;The complete public source code is available here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/allenkisathya9723/murf-livekit-starter" rel="noopener noreferrer"&gt;JanMitra GitHub Repository&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The repository contains the backend, frontend, automated tests, and configuration examples. Private environment files and local databases are intentionally excluded.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Building JanMitra over these ten days taught me much more than how to connect AI APIs.&lt;/p&gt;

&lt;p&gt;It taught me how to think about conversations, reliability, latency, safety, memory, privacy, debugging, and user experience.&lt;/p&gt;

&lt;p&gt;The project started as a voice assistant. It gradually became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Voice
  ↓
Multilingual Conversations
  ↓
Memory
  ↓
Healthcare Tools
  ↓
Health-Camp Information
  ↓
Outbound Calling
  ↓
Human Escalation
  ↓
Call Analytics
  ↓
Clinic &amp;amp; Appointment Specialist
  ↓
Context-Preserving Handoff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The most valuable part wasn't getting everything working on the first attempt. It was breaking things, investigating why they broke, fixing them, and testing again. That process changed how I think about AI development.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Build. Break. Debug. Test. Improve.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's what these ten days were really about.&lt;/p&gt;

&lt;p&gt;A huge thank you to &lt;strong&gt;Murf AI&lt;/strong&gt; for organizing the &lt;strong&gt;10 Days of Voice Agents — VoiceForBharat Edition&lt;/strong&gt; and giving me the opportunity to build and experiment with real-time voice AI. I'm especially grateful for the opportunity to work with &lt;strong&gt;Murf Falcon&lt;/strong&gt;, which became an important part of JanMitra's voice experience.&lt;/p&gt;

&lt;p&gt;JanMitra is not the final version of what I want to build. But it is a strong beginning.&lt;/p&gt;

&lt;h1&gt;
  
  
  🚀 JanMitra — A Voice for Better Health Access.
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Useful Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/allenkisathya9723/murf-livekit-starter" rel="noopener noreferrer"&gt;https://github.com/allenkisathya9723/murf-livekit-starter&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Murf AI:&lt;/strong&gt; &lt;a href="https://murf.ai/" rel="noopener noreferrer"&gt;https://murf.ai/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LiveKit:&lt;/strong&gt; &lt;a href="https://livekit.io/" rel="noopener noreferrer"&gt;https://livekit.io/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deepgram:&lt;/strong&gt; &lt;a href="https://deepgram.com/" rel="noopener noreferrer"&gt;https://deepgram.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  VoiceForBharat #10DaysOfVoiceAgents #MurfAI #VoiceAI #LiveKit #HealthcareAI #GenerativeAI #MultilingualAI
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>murfai</category>
      <category>voiceai</category>
    </item>
  </channel>
</rss>
