<?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: Pratyush Dutta</title>
    <description>The latest articles on DEV Community by Pratyush Dutta (@pratyush_dutta).</description>
    <link>https://dev.to/pratyush_dutta</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%2F3243842%2F20916b85-234f-4bd4-87e2-da8400de6c1e.jpg</url>
      <title>DEV Community: Pratyush Dutta</title>
      <link>https://dev.to/pratyush_dutta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pratyush_dutta"/>
    <language>en</language>
    <item>
      <title>From a Voice Agent to a Disaster Response System: Building Pooja with LiveKit and Murf Falcon</title>
      <dc:creator>Pratyush Dutta</dc:creator>
      <pubDate>Sat, 15 Aug 2026 17:58:35 +0000</pubDate>
      <link>https://dev.to/pratyush_dutta/from-a-voice-agent-to-a-disaster-response-system-building-pooja-with-livekit-and-murf-falcon-4g1l</link>
      <guid>https://dev.to/pratyush_dutta/from-a-voice-agent-to-a-disaster-response-system-building-pooja-with-livekit-and-murf-falcon-4g1l</guid>
      <description>&lt;p&gt;How I built a multilingual AI disaster-response voice agent with memory, real-time weather data, telephony, human escalation, analytics, and specialist handoffs during the 10 Days of Voice Agents — VoiceForBharat Edition.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What started as a simple voice agent quickly turned into something much more ambitious.&lt;/p&gt;

&lt;p&gt;During the 10 Days of Voice Agents — VoiceForBharat Edition, I built Pooja, a real-time AI-powered disaster-response voice agent designed to help people during situations where information needs to be delivered quickly, naturally, and reliably.&lt;/p&gt;

&lt;p&gt;The core idea was simple:&lt;/p&gt;

&lt;p&gt;What if someone could call an AI assistant during a disaster, speak naturally in an Indian language, receive verified information, get connected to a human when necessary, and have the system remember important information across conversations?&lt;/p&gt;

&lt;p&gt;That question became the foundation for Pooja.&lt;/p&gt;

&lt;p&gt;Over the challenge, I progressively evolved the system from a basic conversational voice agent into a more complete architecture involving:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Real-time voice communication&lt;/li&gt;
&lt;li&gt;Indian English and Hindi code-switching&lt;/li&gt;
&lt;li&gt;Murf Falcon for low-latency text-to-speech&lt;/li&gt;
&lt;li&gt;Gemini as the reasoning layer&lt;/li&gt;
&lt;li&gt;Deepgram for speech recognition&lt;/li&gt;
&lt;li&gt;LiveKit for real-time communication&lt;/li&gt;
&lt;li&gt;Persistent caller memory&lt;/li&gt;
&lt;li&gt;Live weather data&lt;/li&gt;
&lt;li&gt;Outbound phone calls&lt;/li&gt;
&lt;li&gt;Human escalation&lt;/li&gt;
&lt;li&gt;Slack notifications&lt;/li&gt;
&lt;li&gt;Call analytics&lt;/li&gt;
&lt;li&gt;A WebGL-powered frontend&lt;/li&gt;
&lt;li&gt;Multi-agent specialist handoffs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This article explains what I built, why I built it, the problems I encountered, and how the different components fit together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The Problem I Wanted to Solve&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;During a disaster, people don't necessarily need another complicated application.&lt;/p&gt;

&lt;p&gt;They need answers.&lt;/p&gt;

&lt;p&gt;Questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Is there a flood warning in my district?"&lt;/li&gt;
&lt;li&gt;"What should I do right now?"&lt;/li&gt;
&lt;li&gt;"Where is the nearest shelter?"&lt;/li&gt;
&lt;li&gt;"I'm trapped. Can someone help me?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions become particularly challenging when users are under stress, using mobile devices, have limited digital literacy, or prefer communicating in their native language.&lt;/p&gt;

&lt;p&gt;That's where voice becomes valuable.&lt;/p&gt;

&lt;p&gt;Instead of requiring someone to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open a website&lt;/li&gt;
&lt;li&gt;Navigate through menus&lt;/li&gt;
&lt;li&gt;Read alerts&lt;/li&gt;
&lt;li&gt;Search for a shelter&lt;/li&gt;
&lt;li&gt;Fill out a form&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;they can simply speak to the system.&lt;/p&gt;

&lt;p&gt;The goal of Pooja was therefore not to create a generic chatbot.&lt;/p&gt;

&lt;p&gt;It was to create a voice-first disaster-response interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Why Voice?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Voice changes the interaction model completely.&lt;/p&gt;

&lt;p&gt;A traditional application expects:&lt;/p&gt;

&lt;p&gt;User&lt;br&gt;
 ↓&lt;br&gt;
Read&lt;br&gt;
 ↓&lt;br&gt;
Understand&lt;br&gt;
 ↓&lt;br&gt;
Navigate&lt;br&gt;
 ↓&lt;br&gt;
Click&lt;br&gt;
 ↓&lt;br&gt;
Submit&lt;/p&gt;

&lt;p&gt;A voice agent can reduce that to:&lt;/p&gt;

&lt;p&gt;User&lt;br&gt;
 ↓&lt;br&gt;
Speak&lt;br&gt;
 ↓&lt;br&gt;
AI understands&lt;br&gt;
 ↓&lt;br&gt;
AI responds&lt;/p&gt;

&lt;p&gt;This becomes especially useful when the user may be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stressed&lt;/li&gt;
&lt;li&gt;moving&lt;/li&gt;
&lt;li&gt;unable to type&lt;/li&gt;
&lt;li&gt;unfamiliar with technology&lt;/li&gt;
&lt;li&gt;more comfortable speaking Hindi or another Indian language&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this reason, multilingual and code-mixed conversations became an important part of Pooja.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;The Core Architecture&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At a high level, Pooja uses the following voice pipeline:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;              USER
                │
                ▼
          ┌───────────┐
          │  LiveKit  │
          │ Real-Time │
          │ Transport │
          └─────┬─────┘
                │
                ▼
          ┌───────────┐
          │ Deepgram  │
          │    STT    │
          └─────┬─────┘
                │
                ▼
          ┌───────────┐
          │  Gemini   │
          │    LLM    │
          └─────┬─────┘
                │
    ┌───────────┼────────────┐
    │           │            │
    ▼           ▼            ▼
 Memory      Weather     Escalation
  Tools        Tool         Tool
    │           │            │
    ▼           ▼            ▼
 SQLite     Open-Meteo     SQLite
                              │
                              ▼
                            Slack
                │
                ▼
          ┌───────────┐
          │   Murf    │
          │  Falcon   │
          │    TTS    │
          └─────┬─────┘
                │
                ▼
              USER
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;For real phone calls, I extended the architecture further:&lt;/p&gt;

&lt;p&gt;Pooja&lt;br&gt;
  ↓&lt;br&gt;
LiveKit Cloud&lt;br&gt;
  ↓&lt;br&gt;
SIP&lt;br&gt;
  ↓&lt;br&gt;
Twilio&lt;br&gt;
  ↓&lt;br&gt;
Real Phone Number&lt;/p&gt;

&lt;p&gt;This allowed the project to move beyond a browser-only demonstration.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;4. Giving the Agent a Personality&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the first lessons I learned was that connecting an LLM to speech does not automatically create a good voice agent.&lt;/p&gt;

&lt;p&gt;The agent needs a clear identity, objectives, boundaries, and communication style.&lt;/p&gt;

&lt;p&gt;I structured Pooja's system prompt into operational sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IDENTITY&lt;/li&gt;
&lt;li&gt;OBJECTIVES&lt;/li&gt;
&lt;li&gt;KNOWLEDGE&lt;/li&gt;
&lt;li&gt;LANGUAGE&lt;/li&gt;
&lt;li&gt;GUARDRAILS&lt;/li&gt;
&lt;li&gt;STYLE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Identity&lt;/p&gt;

&lt;p&gt;Pooja is a disaster-response voice assistant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Objectives&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Her job is to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;provide verified disaster-related information&lt;/li&gt;
&lt;li&gt;understand the caller's situation&lt;/li&gt;
&lt;li&gt;provide safe guidance&lt;/li&gt;
&lt;li&gt;escalate serious emergencies when required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Guardrails&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pooja must never:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;invent emergency information&lt;/li&gt;
&lt;li&gt;claim an evacuation order without verification&lt;/li&gt;
&lt;li&gt;fabricate rescue ETAs&lt;/li&gt;
&lt;li&gt;pretend a shelter is available without reliable data&lt;/li&gt;
&lt;li&gt;provide unsupported medical advice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This separation made the system prompt much easier to reason about and debug.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Multilingual and Code-Mixed Conversations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For an India-focused voice agent, supporting only English wasn't enough.&lt;/p&gt;

&lt;p&gt;I wanted Pooja to naturally handle conversations such as:&lt;/p&gt;

&lt;p&gt;"Mere area mein flood warning hai kya?"&lt;/p&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;p&gt;"Can you tell me ki nearest shelter kahan hai?"&lt;/p&gt;

&lt;p&gt;The objective wasn't simply translation.&lt;/p&gt;

&lt;p&gt;The agent needed to understand code-mixed speech and respond naturally in the appropriate language/register.&lt;/p&gt;

&lt;p&gt;The pipeline therefore combines:&lt;/p&gt;

&lt;p&gt;Deepgram STT → Gemini → Murf Falcon TTS&lt;/p&gt;

&lt;p&gt;with instructions to preserve the user's language preference and conversational style.&lt;/p&gt;

&lt;p&gt;This allowed Pooja to move between Indian English and Hindi naturally rather than forcing the user into a rigid language mode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Murf Falcon for Real-Time Voice&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The voice is a major part of the experience.&lt;/p&gt;

&lt;p&gt;For this project, I used Murf Falcon as the text-to-speech layer through the LiveKit Murf integration.&lt;/p&gt;

&lt;p&gt;The objective was low-latency, conversational speech rather than waiting for an entire response to be generated before playback began.&lt;/p&gt;

&lt;p&gt;This made interactions feel much closer to a real conversation.&lt;/p&gt;

&lt;p&gt;The voice configuration was also aligned with the project's India-focused use case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Building Persistent Memory&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A voice assistant that forgets everything after every call quickly becomes frustrating.&lt;/p&gt;

&lt;p&gt;So I introduced persistent caller memory using SQLite.&lt;/p&gt;

&lt;p&gt;The system stores information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;user_id&lt;/li&gt;
&lt;li&gt;name&lt;/li&gt;
&lt;li&gt;language_preference&lt;/li&gt;
&lt;li&gt;location&lt;/li&gt;
&lt;li&gt;household information&lt;/li&gt;
&lt;li&gt;last interaction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important architectural decision was:&lt;/p&gt;

&lt;p&gt;The LLM doesn't directly manipulate the database.&lt;/p&gt;

&lt;p&gt;Instead, it uses tools.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lookup_caller()&lt;/li&gt;
&lt;li&gt;save_caller_info()&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The flow becomes:&lt;/p&gt;

&lt;p&gt;Caller&lt;br&gt;
   ↓&lt;br&gt;
Pooja&lt;br&gt;
   ↓&lt;br&gt;
Needs caller information?&lt;br&gt;
   ↓&lt;br&gt;
lookup_caller()&lt;br&gt;
   ↓&lt;br&gt;
SQLite&lt;br&gt;
   ↓&lt;br&gt;
Information returned&lt;br&gt;
   ↓&lt;br&gt;
Pooja continues conversation&lt;/p&gt;

&lt;p&gt;This keeps database access inside controlled application code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Consent and Safety Around Memory&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Memory introduces another problem:&lt;/p&gt;

&lt;p&gt;What information should an AI actually remember?&lt;/p&gt;

&lt;p&gt;I added explicit guardrails around persistent information.&lt;/p&gt;

&lt;p&gt;For sensitive information, the agent should not casually save everything it hears.&lt;/p&gt;

&lt;p&gt;The system is designed to explain when information is being retained and why it is needed for the disaster-response workflow.&lt;/p&gt;

&lt;p&gt;This was an important lesson for me:&lt;/p&gt;

&lt;p&gt;Adding memory isn't just a database problem. It's also a trust and privacy problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Connecting Pooja to Live Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A disaster-response agent cannot rely entirely on static knowledge.&lt;/p&gt;

&lt;p&gt;For Day 5, I connected Pooja to the Open-Meteo API to retrieve live weather information.&lt;/p&gt;

&lt;p&gt;I implemented a custom asynchronous tool:&lt;/p&gt;

&lt;p&gt;get_district_alert()&lt;/p&gt;

&lt;p&gt;The tool retrieves weather metrics such as:&lt;/p&gt;

&lt;p&gt;precipitation&lt;br&gt;
wind speed&lt;br&gt;
short-term forecast information&lt;br&gt;
timestamps associated with the data&lt;/p&gt;

&lt;p&gt;The LLM decides when this tool is necessary based on the user's request.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;"Is there a flood warning in my district?"&lt;/p&gt;

&lt;p&gt;can trigger the weather lookup.&lt;/p&gt;

&lt;p&gt;The important part is that the returned API data is transformed into a natural spoken response rather than being read out as raw JSON.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. Handling API Failure Gracefully&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the most important lessons from the project was:&lt;/p&gt;

&lt;p&gt;A tool failing should never cause the voice agent to silently break or hallucinate an answer.&lt;/p&gt;

&lt;p&gt;External APIs can fail.&lt;/p&gt;

&lt;p&gt;They can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;timeout&lt;/li&gt;
&lt;li&gt;return errors&lt;/li&gt;
&lt;li&gt;become unavailable&lt;/li&gt;
&lt;li&gt;hit rate limits&lt;/li&gt;
&lt;li&gt;return incomplete data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I implemented explicit fallback handling.&lt;/p&gt;

&lt;p&gt;If the weather API becomes unavailable, Pooja can say something like:&lt;/p&gt;

&lt;p&gt;"I'm currently unable to reach the meteorological live feed, so I can't verify the latest information right now."&lt;/p&gt;

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

&lt;p&gt;"There is no flood warning."&lt;/p&gt;

&lt;p&gt;The difference is critical.&lt;/p&gt;

&lt;p&gt;The agent must distinguish between:&lt;/p&gt;

&lt;p&gt;"I don't know"&lt;/p&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;p&gt;"I verified that there isn't one."&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Solving an LLM Tool Loop&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One particularly interesting debugging problem happened when the weather tool was introduced.&lt;/p&gt;

&lt;p&gt;Under certain ambiguous user inputs, the LLM could repeatedly attempt to call the same tool.&lt;/p&gt;

&lt;p&gt;That created an LLM tool loop, eventually contributing to API quota exhaustion.&lt;/p&gt;

&lt;p&gt;The root problem wasn't simply the API.&lt;/p&gt;

&lt;p&gt;It was the interaction between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tool descriptions&lt;/li&gt;
&lt;li&gt;system instructions&lt;/li&gt;
&lt;li&gt;ambiguous user input&lt;/li&gt;
&lt;li&gt;LLM decision-making&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I refined the tool descriptions and system prompt to make the tool's intended usage much more explicit.&lt;/p&gt;

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

&lt;p&gt;A function tool's description is part of the agent's control logic.&lt;/p&gt;

&lt;p&gt;If the model doesn't understand when a tool should be used, the function implementation itself may be perfectly correct and the system can still behave incorrectly.&lt;/p&gt;




&lt;p&gt;*&lt;em&gt;12. Taking Pooja Beyond the Browser&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
A major milestone came on Day 6.&lt;/p&gt;

&lt;p&gt;I migrated the system from a local LiveKit server to LiveKit Cloud and connected it to real telephony infrastructure.&lt;/p&gt;

&lt;p&gt;The pipeline became:&lt;/p&gt;

&lt;p&gt;Pooja&lt;br&gt;
 ↓&lt;br&gt;
LiveKit Cloud&lt;br&gt;
 ↓&lt;br&gt;
SIP Outbound Trunk&lt;br&gt;
 ↓&lt;br&gt;
Twilio&lt;br&gt;
 ↓&lt;br&gt;
Real Phone&lt;/p&gt;

&lt;p&gt;I built an outbound call orchestration flow using the LiveKit Server API.&lt;/p&gt;

&lt;p&gt;The system could:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a unique LiveKit room&lt;/li&gt;
&lt;li&gt;Dispatch the agent&lt;/li&gt;
&lt;li&gt;Configure the outbound SIP participant&lt;/li&gt;
&lt;li&gt;Initiate the call&lt;/li&gt;
&lt;li&gt;Connect Pooja to a real phone number&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This was the moment when the project stopped being only a browser demo.&lt;/p&gt;

&lt;p&gt;Pooja could now actually make a phone call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;13. Context-Aware Outbound Calls&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Outbound calls require a slightly different conversational strategy.&lt;/p&gt;

&lt;p&gt;A user calling Pooja might start with:&lt;/p&gt;

&lt;p&gt;"Hello, what can you help me with?"&lt;/p&gt;

&lt;p&gt;But when Pooja initiates the call, she needs to proactively explain why she's calling.&lt;/p&gt;

&lt;p&gt;I therefore introduced outbound/inbound context detection and separate greeting behavior.&lt;/p&gt;

&lt;p&gt;This allowed the same agent architecture to support both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inbound:&lt;/li&gt;
&lt;li&gt;Caller → Pooja&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Outbound:&lt;/li&gt;
&lt;li&gt;Pooja → Caller&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also added handling for explicit "stop" requests so the agent would respect the caller's decision to end the interaction.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;14. Knowing When AI Should Stop&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This became one of the most important features of Pooja.&lt;/p&gt;

&lt;p&gt;An AI disaster-response system should not try to solve every emergency itself.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;"I'm trapped inside my house and the water is rising."&lt;/p&gt;

&lt;p&gt;is fundamentally different from:&lt;/p&gt;

&lt;p&gt;"What's the weather forecast?"&lt;/p&gt;

&lt;p&gt;So I built a human escalation mechanism.&lt;/p&gt;

&lt;p&gt;The architecture became:&lt;/p&gt;

&lt;p&gt;Caller&lt;br&gt;
  ↓&lt;br&gt;
Pooja&lt;br&gt;
  ↓&lt;br&gt;
Emergency detected&lt;br&gt;
  ↓&lt;br&gt;
Ask permission&lt;br&gt;
  ↓&lt;br&gt;
Create escalation ticket&lt;br&gt;
  ↓&lt;br&gt;
Generate reference ID&lt;br&gt;
  ↓&lt;br&gt;
Notify human operator&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;15. Human-in-the-Loop Escalation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I created an escalation tool that generates a persistent ticket in SQLite.&lt;/p&gt;

&lt;p&gt;The ticket captures useful operational information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;who needs help&lt;/li&gt;
&lt;li&gt;what happened&lt;/li&gt;
&lt;li&gt;urgency&lt;/li&gt;
&lt;li&gt;relevant location information&lt;/li&gt;
&lt;li&gt;what Pooja already checked&lt;/li&gt;
&lt;li&gt;caller language/follow-up preference
The caller receives a reference ID.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means that when a human responder takes over, the caller doesn't necessarily have to repeat their entire situation.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;16. Slack Integration for Human Operators&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I also connected the escalation system to Slack using a webhook.&lt;/p&gt;

&lt;p&gt;When an escalation is created:&lt;/p&gt;

&lt;p&gt;Pooja&lt;br&gt;
 ↓&lt;br&gt;
SQLite Ticket&lt;br&gt;
 ↓&lt;br&gt;
Slack Webhook&lt;br&gt;
 ↓&lt;br&gt;
Human Operator&lt;/p&gt;

&lt;p&gt;The operator receives a structured emergency alert containing the relevant information and reference ID.&lt;/p&gt;

&lt;p&gt;This created a bridge between the AI system and an actual human workflow.&lt;/p&gt;

&lt;p&gt;The objective was never:&lt;/p&gt;

&lt;p&gt;"AI replaces the emergency operator."&lt;/p&gt;

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

&lt;p&gt;"AI handles the first interaction and knows when to bring a human into the loop."&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;17. Measuring Whether Calls Actually Succeed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After building all these capabilities, another question became important:&lt;/p&gt;

&lt;p&gt;How do I know whether Pooja is actually doing its job?&lt;/p&gt;

&lt;p&gt;That's what led to the Day 8 analytics layer.&lt;/p&gt;

&lt;p&gt;I introduced persistent call outcome tracking.&lt;/p&gt;

&lt;p&gt;A call could be considered successful if, for example:&lt;/p&gt;

&lt;p&gt;Pooja successfully delivered verified information&lt;br&gt;
Pooja successfully created a human-help request&lt;/p&gt;

&lt;p&gt;Otherwise, the call could be recorded as unsuccessful depending on whether the defined objective was achieved.&lt;/p&gt;

&lt;p&gt;The backend now records 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;/ul&gt;

&lt;p&gt;These values are derived from real interactions rather than hardcoded dashboard numbers.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;18. Building the Analytics Dashboard&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built a lightweight Python analytics server exposing:&lt;/p&gt;

&lt;p&gt;/api/stats&lt;/p&gt;

&lt;p&gt;This acts as the bridge between SQLite and the Next.js dashboard.&lt;/p&gt;

&lt;p&gt;The frontend then retrieves the actual call statistics dynamically.&lt;/p&gt;

&lt;p&gt;I also spent time making the dashboard feel like a proper product rather than a plain admin page.&lt;/p&gt;

&lt;p&gt;The dashboard includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebGL shader background&lt;/li&gt;
&lt;li&gt;Ruby Red visual identity&lt;/li&gt;
&lt;li&gt;Glassmorphism cards&lt;/li&gt;
&lt;li&gt;GSAP skeleton loading&lt;/li&gt;
&lt;li&gt;Staggered entrance animations&lt;/li&gt;
&lt;li&gt;Responsive layout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also encountered an interesting frontend bug where GSAP cleanup was inadvertently removing React's inline styling.&lt;/p&gt;

&lt;p&gt;Fixing that required separating the animation properties from the visual styling properties rather than allowing the animation lifecycle to manipulate both.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;19. Introducing a Specialist Agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By Day 9, Pooja had accumulated quite a lot of responsibilities.&lt;/p&gt;

&lt;p&gt;Instead of making the main agent even larger, I introduced a specialist agent.&lt;/p&gt;

&lt;p&gt;For the Disaster Response track, I created a:&lt;/p&gt;

&lt;p&gt;Shelter Information Specialist&lt;/p&gt;

&lt;p&gt;Its job is intentionally narrow:&lt;/p&gt;

&lt;p&gt;Find and communicate verified shelter information relevant to the caller.&lt;/p&gt;

&lt;p&gt;It can handle questions such as:&lt;/p&gt;

&lt;p&gt;"Where is the nearest shelter?"&lt;/p&gt;

&lt;p&gt;"Is there a shelter near me?"&lt;/p&gt;

&lt;p&gt;"Does the shelter have capacity?"&lt;/p&gt;

&lt;p&gt;But it doesn't need to understand everything Pooja understands.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;20. Multi-Agent Handoff&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The architecture now looks like:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                     POOJA
                Main Agent
                     │
                     │
          Shelter-related request
                     │
                     ▼
           ┌─────────────────┐
           │ Shelter         │
           │ Specialist      │
           └────────┬────────┘
                    │
                    ▼
             Shelter Lookup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Pooja uses a dedicated handoff tool when the user's request requires specialist knowledge.&lt;/p&gt;

&lt;p&gt;The transition is explicit:&lt;/p&gt;

&lt;p&gt;"I'll connect you to our shelter information specialist."&lt;/p&gt;

&lt;p&gt;The specialist then introduces itself and continues the conversation.&lt;/p&gt;

&lt;p&gt;Most importantly, the conversation context is preserved.&lt;/p&gt;

&lt;p&gt;The caller doesn't have to explain everything again.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;21. The Final Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After the challenge, Pooja's architecture looks approximately like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                     ┌─────────────────────┐
                     │       Caller        │
                     └──────────┬──────────┘
                                │
                                ▼
                     ┌─────────────────────┐
                     │      LiveKit        │
                     │  Real-Time Transport│
                     └──────────┬──────────┘
                                │
                          Speech Input
                                │
                                ▼
                     ┌─────────────────────┐
                     │      Deepgram       │
                     │        STT          │
                     └──────────┬──────────┘
                                │
                                ▼
                     ┌─────────────────────┐
                     │       Gemini        │
                     │        LLM          │
                     └──────────┬──────────┘
                                │
           ┌────────────────────┼────────────────────┐
           │                    │                    │
           ▼                    ▼                    ▼
       Memory Tool         Weather Tool        Escalation
           │                    │                    │
           ▼                    ▼                    ▼
        SQLite             Open-Meteo            SQLite
                                                    │
                                                    ▼
                                                  Slack
                                │
                                ▼
                     ┌─────────────────────┐
                     │ Shelter Specialist  │
                     └─────────────────────┘
                                │
                                ▼
                          Shelter Data

                                │
                                ▼
                     ┌─────────────────────┐
                     │     Murf Falcon     │
                     │        TTS          │
                     └──────────┬──────────┘
                                │
                                ▼
                              Caller
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;And for real phone calls:&lt;/p&gt;

&lt;p&gt;Pooja&lt;br&gt;
  ↓&lt;br&gt;
LiveKit Cloud&lt;br&gt;
  ↓&lt;br&gt;
SIP&lt;br&gt;
  ↓&lt;br&gt;
Twilio&lt;br&gt;
  ↓&lt;br&gt;
Real Phone&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;22. The Hardest Problems I Encountered&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building this wasn't a straight line from idea to working application.&lt;/p&gt;

&lt;p&gt;Some of the most valuable lessons came from things that didn't work immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;22.1 Localhost vs Real Telephony&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Initially, the agent worked in a local development environment.&lt;/p&gt;

&lt;p&gt;Moving to real phone calls introduced an entirely different set of considerations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LiveKit Cloud&lt;/li&gt;
&lt;li&gt;SIP&lt;/li&gt;
&lt;li&gt;Twilio&lt;/li&gt;
&lt;li&gt;outbound trunks&lt;/li&gt;
&lt;li&gt;authentication&lt;/li&gt;
&lt;li&gt;room orchestration&lt;/li&gt;
&lt;li&gt;latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The lesson was that a voice agent is not just an LLM + TTS.&lt;/p&gt;

&lt;p&gt;The transport layer matters just as much.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;22.2 Tool Loops and LLM Behavior&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The weather tool taught me that a correctly implemented function can still cause problems if the LLM doesn't understand when it should call it.&lt;/p&gt;

&lt;p&gt;Repeated tool calls resulted in quota exhaustion.&lt;/p&gt;

&lt;p&gt;Improving the tool description and system-level instructions helped constrain the behavior.&lt;/p&gt;

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

&lt;p&gt;Prompt engineering and tool engineering are interconnected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;22.3 External API Failures&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Real APIs fail.&lt;/p&gt;

&lt;p&gt;Instead of allowing failures to propagate into the conversation, I built explicit fallback paths.&lt;/p&gt;

&lt;p&gt;That made Pooja behave more like a reliable system and less like a demo that assumes everything is always available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;22.4 Context Preservation During Agent Handoffs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Introducing a specialist created another challenge.&lt;/p&gt;

&lt;p&gt;A new agent normally needs its own context.&lt;/p&gt;

&lt;p&gt;But the caller shouldn't have to repeat:&lt;/p&gt;

&lt;p&gt;"I'm in X district and I need a shelter because..."&lt;/p&gt;

&lt;p&gt;every time control changes.&lt;/p&gt;

&lt;p&gt;Passing the existing conversation context during the handoff allowed the specialist to continue naturally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;22.5 Frontend Animation and React State&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The analytics dashboard also produced a subtle issue.&lt;/p&gt;

&lt;p&gt;GSAP cleanup was interacting with React's inline styles.&lt;/p&gt;

&lt;p&gt;The animations worked, but the cleanup phase could remove styling that the React component still depended on.&lt;/p&gt;

&lt;p&gt;The solution was to separate:&lt;/p&gt;

&lt;p&gt;Animation state&lt;/p&gt;

&lt;p&gt;from:&lt;/p&gt;

&lt;p&gt;Component visual state&lt;/p&gt;

&lt;p&gt;This was a good reminder that polished UI work requires understanding the lifecycle of both libraries involved.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;23. How to Build Your Own Voice Agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you want to build a similar system, the basic architecture is surprisingly approachable.&lt;/p&gt;

&lt;p&gt;A real-time voice agent generally needs four major pieces:&lt;/p&gt;

&lt;p&gt;Speech-to-Text&lt;br&gt;
      ↓&lt;br&gt;
     LLM&lt;br&gt;
      ↓&lt;br&gt;
Text-to-Speech&lt;br&gt;
      ↓&lt;br&gt;
Real-Time Transport&lt;/p&gt;

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

&lt;p&gt;Deepgram → Gemini → Murf Falcon&lt;br&gt;
              │&lt;br&gt;
              ▼&lt;br&gt;
           LiveKit&lt;/p&gt;

&lt;p&gt;LiveKit handles the real-time communication layer while the AI services handle speech recognition, reasoning, and speech generation.&lt;/p&gt;

&lt;p&gt;Once this basic pipeline works, you can progressively add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;li&gt;Tools&lt;/li&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;Database&lt;/li&gt;
&lt;li&gt;Telephony&lt;/li&gt;
&lt;li&gt;Human Escalation&lt;/li&gt;
&lt;li&gt;Analytics&lt;/li&gt;
&lt;li&gt;Specialist Agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important thing is not to build everything at once.&lt;/p&gt;

&lt;p&gt;Build the smallest working voice loop first.&lt;/p&gt;

&lt;p&gt;Then add capabilities one at a time.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;24. Basic Project Setup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Clone the project:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git clone https://github.com/pratyush06-aec/murf-livekit-starter.git&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Create a Python virtual environment:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;python -m venv .venv&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Activate it on Windows:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.venv\Scripts\Activate.ps1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Install dependencies:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pip install -r requirements.txt&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then configure your environment variables.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;`LIVEKIT_URL=...&lt;br&gt;
LIVEKIT_API_KEY=...&lt;br&gt;
LIVEKIT_API_SECRET=...&lt;/p&gt;

&lt;p&gt;DEEPGRAM_API_KEY=...&lt;br&gt;
GOOGLE_API_KEY=...&lt;br&gt;
MURF_API_KEY=...&lt;/p&gt;

&lt;p&gt;TWILIO_ACCOUNT_SID=...&lt;br&gt;
TWILIO_AUTH_TOKEN=...`&lt;/p&gt;

&lt;p&gt;Never commit these values to GitHub.&lt;/p&gt;

&lt;p&gt;Add your environment file to .gitignore:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.env&lt;br&gt;
.env.*&lt;br&gt;
!.env.example&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You can safely commit an example configuration:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;LIVEKIT_URL=&lt;br&gt;
LIVEKIT_API_KEY=&lt;br&gt;
LIVEKIT_API_SECRET=&lt;br&gt;
DEEPGRAM_API_KEY=&lt;br&gt;
GOOGLE_API_KEY=&lt;br&gt;
MURF_API_KEY=&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;25. Keeping Secrets Out of the Repository&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This became especially important once the project involved:&lt;/p&gt;

&lt;p&gt;LiveKit credentials&lt;br&gt;
Gemini credentials&lt;br&gt;
Deepgram credentials&lt;br&gt;
Murf credentials&lt;br&gt;
Twilio credentials&lt;br&gt;
Slack webhooks&lt;/p&gt;

&lt;p&gt;Never place these directly inside:&lt;/p&gt;

&lt;p&gt;API_KEY = "your-secret-key"&lt;/p&gt;

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

&lt;p&gt;import os&lt;/p&gt;

&lt;p&gt;API_KEY = os.getenv("MURF_API_KEY")&lt;/p&gt;

&lt;p&gt;Keep the real values in your local environment or secure deployment environment.&lt;/p&gt;

&lt;p&gt;If a credential is accidentally committed, rotating/revoking it is necessary. Simply deleting it from the latest commit is not sufficient because Git history may still contain it.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;26. Running and Testing the Agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once the environment variables are configured, start the LiveKit agent according to the project's development command.&lt;/p&gt;

&lt;p&gt;Then connect through the frontend or configured LiveKit client.&lt;/p&gt;

&lt;p&gt;A useful first test is simply:&lt;/p&gt;

&lt;p&gt;"Hello Pooja, can you hear me?"&lt;/p&gt;

&lt;p&gt;Then progressively test:&lt;/p&gt;

&lt;p&gt;Test 1 — General conversation&lt;/p&gt;

&lt;p&gt;"What can you help me with?"&lt;/p&gt;

&lt;p&gt;Test 2 — Weather tool&lt;/p&gt;

&lt;p&gt;"What's the current weather situation in my district?"&lt;/p&gt;

&lt;p&gt;Test 3 — Memory&lt;/p&gt;

&lt;p&gt;"My name is Ramesh and I'm in Asansol."&lt;/p&gt;

&lt;p&gt;Then reconnect and verify that the information can be retrieved appropriately.&lt;/p&gt;

&lt;p&gt;Test 4 — Escalation&lt;/p&gt;

&lt;p&gt;"I'm trapped and need urgent help."&lt;/p&gt;

&lt;p&gt;Verify that Pooja asks for permission before creating the escalation.&lt;/p&gt;

&lt;p&gt;Test 5 — Shelter specialist&lt;/p&gt;

&lt;p&gt;"Where is the nearest emergency shelter?"&lt;/p&gt;

&lt;p&gt;Verify the handoff.&lt;/p&gt;

&lt;p&gt;Test 6 — Outbound call&lt;/p&gt;

&lt;p&gt;Trigger the outbound flow and verify the call reaches the configured phone number.&lt;/p&gt;

&lt;p&gt;Test 7 — Analytics&lt;/p&gt;

&lt;p&gt;Complete a call and verify that the dashboard metrics change based on the actual interaction.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;27. What I Learned During the Challenge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The biggest lesson from these 10 days wasn't a particular API or framework.&lt;/p&gt;

&lt;p&gt;It was understanding that a useful voice agent is a system, not just a prompt.&lt;/p&gt;

&lt;p&gt;A production-oriented architecture needs to think about:&lt;/p&gt;

&lt;p&gt;Conversation&lt;br&gt;
    +&lt;br&gt;
Latency&lt;br&gt;
    +&lt;br&gt;
Memory&lt;br&gt;
    +&lt;br&gt;
Tools&lt;br&gt;
    +&lt;br&gt;
Data&lt;br&gt;
    +&lt;br&gt;
Failures&lt;br&gt;
    +&lt;br&gt;
Security&lt;br&gt;
    +&lt;br&gt;
Human escalation&lt;br&gt;
    +&lt;br&gt;
Observability&lt;br&gt;
    +&lt;br&gt;
Specialization&lt;/p&gt;

&lt;p&gt;Each layer solves a different problem.&lt;/p&gt;

&lt;p&gt;And each layer introduces new failure modes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;28. From "Chatbot" to "Voice System"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At the beginning of the challenge, I was mainly thinking about:&lt;/p&gt;

&lt;p&gt;How do I make an AI talk?&lt;/p&gt;

&lt;p&gt;By the end, the question had completely changed.&lt;/p&gt;

&lt;p&gt;I was thinking about:&lt;/p&gt;

&lt;p&gt;How do I build a voice system that can understand, remember, act, fail safely, escalate, communicate with humans, make phone calls, and measure its own outcomes?&lt;/p&gt;

&lt;p&gt;That's a much more interesting engineering problem.&lt;/p&gt;




&lt;p&gt;*&lt;em&gt;29. What's Next for Pooja?&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
The 10-day challenge gave me the foundation, but there is a lot more I want to explore.&lt;/p&gt;

&lt;p&gt;Some potential next steps include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integrating official government disaster datasets&lt;/li&gt;
&lt;li&gt;More accurate geolocation and nearest-shelter calculations&lt;/li&gt;
&lt;li&gt;Multi-region shelter capacity tracking&lt;/li&gt;
&lt;li&gt;SMS/WhatsApp-based emergency follow-ups&lt;/li&gt;
&lt;li&gt;More Indian language support&lt;/li&gt;
&lt;li&gt;Improved emergency classification&lt;/li&gt;
&lt;li&gt;Stronger authentication for operator dashboards&lt;/li&gt;
&lt;li&gt;Better observability and tracing&lt;/li&gt;
&lt;li&gt;More specialist agents&lt;/li&gt;
&lt;li&gt;More robust evaluation of voice-agent quality&lt;/li&gt;
&lt;li&gt;Production-grade deployment and monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The ultimate goal would be to move Pooja from a challenge project toward a reliable voice-first disaster-response platform.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;30. Final Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building Pooja over these 10 days completely changed the way I think about voice AI.&lt;/p&gt;

&lt;p&gt;What started as:&lt;/p&gt;

&lt;p&gt;Speech → AI → Speech&lt;/p&gt;

&lt;p&gt;eventually became:&lt;/p&gt;

&lt;p&gt;Speech&lt;br&gt;
  ↓&lt;br&gt;
Real-Time Transport&lt;br&gt;
  ↓&lt;br&gt;
Speech Recognition&lt;br&gt;
  ↓&lt;br&gt;
LLM Reasoning&lt;br&gt;
  ↓&lt;br&gt;
Tools + Memory + Live Data&lt;br&gt;
  ↓&lt;br&gt;
Human Escalation / Specialist Handoff&lt;br&gt;
  ↓&lt;br&gt;
Analytics&lt;br&gt;
  ↓&lt;br&gt;
Natural Voice Response&lt;/p&gt;

&lt;p&gt;And that's what made this challenge so valuable.&lt;/p&gt;

&lt;p&gt;I didn't just learn how to connect an LLM to a TTS API.&lt;/p&gt;

&lt;p&gt;I learned how to engineer around an AI model.&lt;/p&gt;

&lt;p&gt;Link of Day 1 Demo: &lt;a href="https://www.linkedin.com/posts/pratyush-dutta-221b94302_voiceforbharat-murfai-voiceai-ugcPost-7491217998469595138-EDNF/" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/pratyush-dutta-221b94302_voiceforbharat-murfai-voiceai-ugcPost-7491217998469595138-EDNF/&lt;/a&gt;&lt;br&gt;
Link of Day 2 Demo: &lt;a href="https://www.linkedin.com/posts/pratyush-dutta-221b94302_voiceforbharat-murfai-livekit-ugcPost-7491575388628967424-Cg3l/" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/pratyush-dutta-221b94302_voiceforbharat-murfai-livekit-ugcPost-7491575388628967424-Cg3l/&lt;/a&gt;&lt;br&gt;
Link of Day 3 Demo: &lt;a href="https://www.linkedin.com/posts/pratyush-dutta-221b94302_voiceforbharat-murfai-livekit-ugcPost-7491983933178331136-L4qs/" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/pratyush-dutta-221b94302_voiceforbharat-murfai-livekit-ugcPost-7491983933178331136-L4qs/&lt;/a&gt;&lt;br&gt;
Link of Day 4 Demo: &lt;a href="https://www.linkedin.com/posts/pratyush-dutta-221b94302_voiceforbharat-murfai-gemini-ugcPost-7492308868140703744-t7wA/" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/pratyush-dutta-221b94302_voiceforbharat-murfai-gemini-ugcPost-7492308868140703744-t7wA/&lt;/a&gt;&lt;br&gt;
Link of Day 5 Demo: &lt;a href="https://www.linkedin.com/posts/pratyush-dutta-221b94302_voiceforbharat-murfai-livekit-ugcPost-7492616307574620160-OYKx/" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/pratyush-dutta-221b94302_voiceforbharat-murfai-livekit-ugcPost-7492616307574620160-OYKx/&lt;/a&gt;&lt;br&gt;
Link of Day 6 Demo: &lt;a href="https://www.linkedin.com/posts/pratyush-dutta-221b94302_10daysofvoiceagentschallenge-voiceforbharat-ugcPost-7493022074911879169-c6Df/" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/pratyush-dutta-221b94302_10daysofvoiceagentschallenge-voiceforbharat-ugcPost-7493022074911879169-c6Df/&lt;/a&gt;&lt;br&gt;
Link of Day 7 Demo: &lt;a href="https://www.linkedin.com/posts/pratyush-dutta-221b94302_voiceforbharat-murfai-livekit-ugcPost-7493372541093322753-B_Lw/" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/pratyush-dutta-221b94302_voiceforbharat-murfai-livekit-ugcPost-7493372541093322753-B_Lw/&lt;/a&gt;&lt;br&gt;
Link of Day 8 Demo: &lt;a href="https://www.linkedin.com/posts/pratyush-dutta-221b94302_voiceforbharat-murfai-livekit-ugcPost-7493765730602065920-_PuB/" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/pratyush-dutta-221b94302_voiceforbharat-murfai-livekit-ugcPost-7493765730602065920-_PuB/&lt;/a&gt;&lt;br&gt;
Link of Day 9 Demo: &lt;a href="https://www.linkedin.com/posts/pratyush-dutta-221b94302_10daysofvoiceagentschallenge-voiceforbharat-ugcPost-7494137786820730881-j4Wj/" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/pratyush-dutta-221b94302_10daysofvoiceagentschallenge-voiceforbharat-ugcPost-7494137786820730881-j4Wj/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>voiceforbharat</category>
      <category>murffalcon</category>
      <category>10daysofaivoiceagents</category>
    </item>
    <item>
      <title>This is a submission for the [GitHub Finish-Up-A-Thon Challenge]</title>
      <dc:creator>Pratyush Dutta</dc:creator>
      <pubDate>Wed, 03 Jun 2026 18:39:20 +0000</pubDate>
      <link>https://dev.to/pratyush_dutta/this-is-a-submission-for-the-github-finish-up-a-thon-challenge-3jho</link>
      <guid>https://dev.to/pratyush_dutta/this-is-a-submission-for-the-github-finish-up-a-thon-challenge-3jho</guid>
      <description>&lt;p&gt;&lt;strong&gt;What I Built:&lt;/strong&gt;&lt;br&gt;
The Context-Preserving Assistant is a modern, full-stack application designed to showcase how to maintain user context (like preferences, location, or customized settings) securely across a distributed system.&lt;/p&gt;

&lt;p&gt;Often, personal assistants need to communicate with various third-party services (like weather, news, or calendar APIs) on behalf of the user. Doing this securely means the frontend should never hold sensitive third-party API keys. Instead, the frontend authenticates the user via Auth0 and receives a secure JWT (JSON Web Token). This token is then passed to our Express Backend, which acts as a secure proxy. The backend validates the user's identity, extracts any custom context (such as a preferred city injected into the token via Auth0 Actions), and securely communicates with third-party APIs using server-side secrets.&lt;/p&gt;

&lt;p&gt;This architecture ensures that user context is preserved seamlessly while maintaining enterprise-grade security for API credentials.&lt;/p&gt;

&lt;p&gt;This is a starter/mentorship scaffold — follow the steps below to configure Auth0 and run the demo.&lt;/p&gt;

&lt;p&gt;It started in MLH GHW: GenAI conducted in the month of May.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://drive.google.com/file/d/1AIFi4Ajrs3Bx4EP4YDxSo0XaGICnKpny/view?usp=sharing" rel="noopener noreferrer" class="c-link"&gt;
            pratyush06-aec_Context-Preserving-Assistant_ Full-Stack Identity &amp;amp; API Access and 7 more pages - Personal - Microsoft​ Edge 2026-06-03 23-51-33.mp4 - Google Drive
          &lt;/a&gt;
        &lt;/h2&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fssl.gstatic.com%2Fimages%2Fbranding%2Fproduct%2F1x%2Fdrive_2020q4_32dp.png" width="32" height="32"&gt;
          drive.google.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Github repo- &lt;a href="https://github.com/pratyush06-aec/Context-Preserving-Assistant" rel="noopener noreferrer"&gt;https://github.com/pratyush06-aec/Context-Preserving-Assistant&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Comeback Story:&lt;/strong&gt;&lt;br&gt;
The project began as a basic starter scaffold with Auth0 authentication and a simple frontend-backend connection, but it lacked a complete workflow to demonstrate secure context preservation across services.&lt;/p&gt;

&lt;p&gt;The main challenge was ensuring that user-specific context could travel securely from authentication to API consumption without exposing sensitive credentials. To solve this, we implemented Auth0 Universal Login, enriched JWTs with user preferences through Auth0 Actions, and built an Express backend that securely validates tokens and acts as a proxy for third-party services.&lt;/p&gt;

&lt;p&gt;We then integrated the OpenWeather API, allowing the assistant to personalize responses using authenticated user context while keeping API keys protected on the server. Finally, we resolved deployment and configuration challenges across Auth0, Render, and Vercel, including audience validation, environment management, CORS, and production routing.&lt;/p&gt;

&lt;p&gt;The end result is a production-style Context-Preserving Assistant that authenticates users once, securely preserves their preferences throughout the session, and performs personalized actions through third-party APIs while maintaining enterprise-grade security and identity propagation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Experience with GitHub Copilot:&lt;/strong&gt;&lt;br&gt;
This project demonstrates how GitHub Copilot accelerated the development of a secure, full-stack Context-Preserving Assistant powered by Auth0, React, Node.js, and OpenWeatherMap.&lt;/p&gt;

&lt;p&gt;Throughout the development process, GitHub Copilot assisted in scaffolding the application architecture, generating frontend and backend starter code, creating protected API routes, and implementing Auth0 authentication flows. It helped establish a React frontend integrated with Auth0 Universal Login and an Express backend secured through JWT validation using Auth0-issued access tokens.&lt;/p&gt;

&lt;p&gt;Copilot also streamlined the implementation of key features, including user profile retrieval, context preservation through custom Auth0 claims, and secure integration with the OpenWeatherMap API. By suggesting boilerplate code, middleware configurations, API handlers, and environment variable structures, it significantly reduced development time while maintaining best practices.&lt;/p&gt;

&lt;p&gt;Beyond code generation, Copilot played an important role in debugging and refinement. It assisted in diagnosing backend startup issues, validating authentication flows, troubleshooting token verification, and ensuring seamless communication between the frontend, backend, Auth0, and third-party services.&lt;/p&gt;

&lt;p&gt;Security improvements were another major contribution. Copilot helped identify an exposed API key, guided secret remediation, supported Git history cleanup, and reinforced secure credential management by ensuring that third-party API keys remained protected on the server side.&lt;/p&gt;

&lt;p&gt;The final outcome is a production-style demonstration of secure identity propagation and context preservation. Users authenticate through Auth0, access protected backend resources, retrieve personalized context, and perform weather lookups through a third-party API—all while maintaining secure authentication and authorization practices. The project showcases how GitHub Copilot can act as an effective AI development partner, accelerating implementation, debugging, security hardening, and documentation throughout the software development lifecycle.&lt;/p&gt;

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

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