<?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: Reet Singh</title>
    <description>The latest articles on DEV Community by Reet Singh (@reet_singh_ee97da2986538e).</description>
    <link>https://dev.to/reet_singh_ee97da2986538e</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%2F3326605%2F99a4b92a-c5fb-4ac8-8209-9fb45450793f.png</url>
      <title>DEV Community: Reet Singh</title>
      <link>https://dev.to/reet_singh_ee97da2986538e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/reet_singh_ee97da2986538e"/>
    <language>en</language>
    <item>
      <title>The Answer Looked Right. That Was the Problem.</title>
      <dc:creator>Reet Singh</dc:creator>
      <pubDate>Sun, 30 Aug 2026 16:28:44 +0000</pubDate>
      <link>https://dev.to/reet_singh_ee97da2986538e/the-answer-looked-right-that-was-the-problem-lhn</link>
      <guid>https://dev.to/reet_singh_ee97da2986538e/the-answer-looked-right-that-was-the-problem-lhn</guid>
      <description>&lt;p&gt;I started building &lt;strong&gt;The Verifier&lt;/strong&gt; because of a slightly uncomfortable thought:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if an AI gives you a perfectly written answer based on yesterday's truth?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not a hallucination. Not an obviously fake source. Just an answer that &lt;em&gt;used to be correct&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That felt more dangerous.&lt;/p&gt;

&lt;p&gt;A polished lie is easy to fear. An outdated fact wearing a confident suit? That one can quietly walk straight into reports, presentations, articles, and important decisions.&lt;/p&gt;

&lt;p&gt;So I decided to build something that would not simply answer a claim.&lt;/p&gt;

&lt;p&gt;It would argue with itself first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet The Verifier
&lt;/h2&gt;

&lt;p&gt;The Verifier is an evidence-first research assistant for public claims.&lt;/p&gt;

&lt;p&gt;You give it a claim such as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Verify that Brian Niccol is the CEO of Starbucks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of immediately producing a confident paragraph, it investigates the claim from two opposing directions.&lt;/p&gt;

&lt;p&gt;One research lane looks for evidence supporting the claim. Another actively searches for credible evidence contradicting it.&lt;/p&gt;

&lt;p&gt;This matters because normal search behaviour has a bias: once we find one convincing source, we usually stop looking.&lt;/p&gt;

&lt;p&gt;The Verifier does not get that luxury.&lt;/p&gt;

&lt;p&gt;It has to search both sides, place the evidence next to each other, and show its work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then Starbucks created the perfect plot twist
&lt;/h2&gt;

&lt;p&gt;The Starbucks leadership example turned out to be a great demonstration.&lt;/p&gt;

&lt;p&gt;One public source identifies Brian Niccol as Starbucks' current chairman and CEO.&lt;/p&gt;

&lt;p&gt;Another Starbucks source names Laxman Narasimhan as CEO.&lt;/p&gt;

&lt;p&gt;Both sources are real. Both come from Starbucks. Both look authoritative.&lt;/p&gt;

&lt;p&gt;So which one should the system trust?&lt;/p&gt;

&lt;p&gt;This is where the project became more than a fancy search interface.&lt;/p&gt;

&lt;p&gt;The answer was hiding in the metadata.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dates are boring—until they solve the mystery
&lt;/h2&gt;

&lt;p&gt;Most people do not get excited about fields such as datePublished, dateModified, or ISO timestamps.&lt;/p&gt;

&lt;p&gt;Honestly, neither did I.&lt;/p&gt;

&lt;p&gt;But those tiny pieces of metadata became the detective of this story.&lt;/p&gt;

&lt;p&gt;The Verifier extracts machine-readable dates from every source. It records which metadata field was used, preserves the original value, and normalizes the date to UTC.&lt;/p&gt;

&lt;p&gt;Now the system can compare evidence deterministically.&lt;/p&gt;

&lt;p&gt;It does not choose a source because it sounds more confident. It can explain that one source represents an older leadership announcement while another contains newer evidence about the company's current leadership.&lt;/p&gt;

&lt;p&gt;That difference matters.&lt;/p&gt;

&lt;p&gt;The conclusion is not merely:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Brian Niccol is CEO.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;The claim is supported by newer public evidence. The conflicting source is legitimate, but outdated.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Suddenly, the contradiction is not something to hide. It is part of the explanation.&lt;/p&gt;

&lt;h2&gt;
  
  
  I wanted the disagreement to remain visible
&lt;/h2&gt;

&lt;p&gt;A lot of AI tools clean up the messy middle.&lt;/p&gt;

&lt;p&gt;You provide a question. Something complicated happens. A neat answer appears.&lt;/p&gt;

&lt;p&gt;Magic.&lt;/p&gt;

&lt;p&gt;Also slightly terrifying.&lt;/p&gt;

&lt;p&gt;I wanted The Verifier to show the messy middle.&lt;/p&gt;

&lt;p&gt;The interface keeps the supporting and conflicting evidence in separate lanes. Each source displays its role, URL, relevant statement, and date information.&lt;/p&gt;

&lt;p&gt;The user can inspect why the system reached its conclusion instead of being asked to trust a glowing confidence score.&lt;/p&gt;

&lt;p&gt;Because “97% confident” sounds impressive, but it does not tell me whether the model checked last year's announcement against today's leadership page.&lt;/p&gt;

&lt;p&gt;Evidence does.&lt;/p&gt;

&lt;h2&gt;
  
  
  The voice feature fought back
&lt;/h2&gt;

&lt;p&gt;I also wanted the experience to feel conversational.&lt;/p&gt;

&lt;p&gt;The original idea was simple: click &lt;strong&gt;Speak brief&lt;/strong&gt;, say the claim, and continue asking questions naturally.&lt;/p&gt;

&lt;p&gt;The browser had other plans.&lt;/p&gt;

&lt;p&gt;At one point, the button barely behaved like a button. Then voice mode required clicking it repeatedly. Even worse, every new interaction felt like the previous conversation had been erased from existence.&lt;/p&gt;

&lt;p&gt;The Verifier had the memory of a goldfish with Wi-Fi.&lt;/p&gt;

&lt;p&gt;That forced me to rethink the feature.&lt;/p&gt;

&lt;p&gt;Voice could not be a one-shot transcription gimmick. It needed to be a continuous conversation where the active claim, collected sources, and date resolution remained available for follow-up questions.&lt;/p&gt;

&lt;p&gt;I also added text as a permanent fallback because demos—and browsers—have a wonderful sense of dramatic timing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The agent can research. It cannot press Save for you.
&lt;/h2&gt;

&lt;p&gt;This became my favourite part of the project.&lt;/p&gt;

&lt;p&gt;After completing the investigation, The Verifier does not automatically store the result.&lt;/p&gt;

&lt;p&gt;It asks the user for approval.&lt;/p&gt;

&lt;p&gt;That is not just a polite message in the interface. The restriction is enforced on the server.&lt;/p&gt;

&lt;p&gt;The server creates a one-time approval token and refuses to persist the dossier until explicit approval is received. Export remains locked as well.&lt;/p&gt;

&lt;p&gt;If the user chooses to keep investigating, nothing is saved.&lt;/p&gt;

&lt;p&gt;Only after server-confirmed approval does the dossier become permanent and downloadable.&lt;/p&gt;

&lt;p&gt;The system can investigate, compare, and explain.&lt;/p&gt;

&lt;p&gt;The final decision still belongs to a human.&lt;/p&gt;

&lt;h2&gt;
  
  
  Of course, the build was not a straight line
&lt;/h2&gt;

&lt;p&gt;The first UI used fictional “Maya Chen” and “Northstar AI” evidence while the backend used the real Starbucks case.&lt;/p&gt;

&lt;p&gt;Very coherent. Absolutely no notes.&lt;/p&gt;

&lt;p&gt;That mismatch had to go.&lt;/p&gt;

&lt;p&gt;Then came GitHub authentication, voice bugs, disappearing conversational context, provider configuration, Groq setup, and a Daytona API key that continued rejecting me like it had a personal grudge.&lt;/p&gt;

&lt;p&gt;Some parts worked immediately. Several parts worked only after I stopped assuming they worked. A few parts smiled during testing and broke the moment I opened the demo.&lt;/p&gt;

&lt;p&gt;That is the real version of building for a hackathon.&lt;/p&gt;

&lt;p&gt;It is not one cinematic montage with energetic music. It is a series of tiny mysteries, questionable browser tabs, and commits that begin with the word “fix.”&lt;/p&gt;

&lt;p&gt;But each problem improved the project.&lt;/p&gt;

&lt;p&gt;The fictional demo became a real public case. The voice button became a conversation. The date field became an explanation. The approval message became a server boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  What The Verifier is really about
&lt;/h2&gt;

&lt;p&gt;The Verifier is not trying to make AI sound smarter.&lt;/p&gt;

&lt;p&gt;It is trying to make AI easier to question.&lt;/p&gt;

&lt;p&gt;The important output is not only the final conclusion. It is the path:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What evidence supported the claim?&lt;/li&gt;
&lt;li&gt;What evidence contradicted it?&lt;/li&gt;
&lt;li&gt;Which source was newer?&lt;/li&gt;
&lt;li&gt;Which metadata field proved that?&lt;/li&gt;
&lt;li&gt;Why was the conflict resolved this way?&lt;/li&gt;
&lt;li&gt;Did a human approve saving the result?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That path becomes an inspectable dossier that a researcher, journalist, policy team, or compliance reviewer can defend.&lt;/p&gt;

&lt;p&gt;The internet changes. Leadership changes. Policies change. Yesterday's correct answer quietly becomes today's misinformation.&lt;/p&gt;

&lt;p&gt;The Verifier is my attempt to catch that moment.&lt;/p&gt;

&lt;p&gt;Not by asking you to trust another polished AI answer.&lt;/p&gt;

&lt;p&gt;By showing you the evidence, explaining the conflict, and waiting for you to decide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify first. Save only when you are ready.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;🚀 &lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://the-verifier.vercel.app" rel="noopener noreferrer"&gt;the-verifier.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Project:&lt;/strong&gt; &lt;a href="https://github.com/Reet24-del/the-verifier" rel="noopener noreferrer"&gt;github.com/Reet24-del/the-verifier&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you build with AI, I would love to know: &lt;strong&gt;what part of an answer do you wish AI tools showed more clearly?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>hackathon</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Good Boy Amnesia: An AI Detective Game where Memory IS the Gameplay 🐶🧠</title>
      <dc:creator>Reet Singh</dc:creator>
      <pubDate>Mon, 17 Aug 2026 07:04:29 +0000</pubDate>
      <link>https://dev.to/reet_singh_ee97da2986538e/good-boy-amnesia-an-ai-detective-game-where-memory-is-the-gameplay-5ap0</link>
      <guid>https://dev.to/reet_singh_ee97da2986538e/good-boy-amnesia-an-ai-detective-game-where-memory-is-the-gameplay-5ap0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/weekend-2026-08-13"&gt;Weekend Challenge: Dog Days Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Good Boy Amnesia&lt;/strong&gt; is a detective game built for Dog Days where an AI agent's entire long-term memory lifecycle — &lt;code&gt;remember → recall → memify → forget&lt;/code&gt; — &lt;strong&gt;is the gameplay loop&lt;/strong&gt;, visualized as a live 3D knowledge graph in Three.js.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Story:
&lt;/h3&gt;

&lt;p&gt;Your owner &lt;strong&gt;Dev&lt;/strong&gt; left you home alone last night, and you threw a legendary neighborhood puppy party. At 6:00 AM, your memory graph was corrupted. Dev arrives home at &lt;strong&gt;noon (12:00 PM)&lt;/strong&gt;, the living room is trashed, and his favorite leather slipper is missing.&lt;/p&gt;

&lt;p&gt;You play &lt;strong&gt;Buster&lt;/strong&gt;, a Golden Retriever whose mind is literally a knowledge graph. Reconstruct what happened last night, interrogate the neighborhood animals, purge false rumors, and find Dev's slipper before he walks through the door!&lt;/p&gt;




&lt;h2&gt;
  
  
  Demo &amp;amp; Screenshots 🎮
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Game Demo&lt;/strong&gt;: &lt;code&gt;https://good-boy-amnesia.vercel.app&lt;/code&gt; &lt;em&gt;(or your Hugging Face Space URL)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video Walkthrough&lt;/strong&gt;: &lt;em&gt;(Optional link to your screen recording)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Gameplay Breakdown:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;🔍 Investigate Hotspots&lt;/strong&gt;: Explore 6 locations (&lt;em&gt;Living Room, Backyard Lawn, Bella's Garden Fence, Dog Park, Lou's Oak Tree Stash, and Rooftop Sandbox&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🗂 File Clues (&lt;code&gt;remember&lt;/code&gt;)&lt;/strong&gt;: Committing a fact adds glowing nodes to your live 3D memory graph in real-time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💬 Interrogate Animals&lt;/strong&gt;: Chat with &lt;strong&gt;Bella&lt;/strong&gt; (the wise cat), &lt;strong&gt;Lou&lt;/strong&gt; (the shifty raccoon), &lt;strong&gt;Rev. Rex&lt;/strong&gt; (the howling Basset Hound), and &lt;strong&gt;Barnaby&lt;/strong&gt; (the hungover pug). The characters read your live graph and react dynamically to your knowledge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🧠 Connect the Dots (&lt;code&gt;memify&lt;/code&gt;)&lt;/strong&gt;: Consolidate stored memories into derived inferences (e.g. realizing the slipper was locked in the treat safe before the party started).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🗑 Purge False Leads (&lt;code&gt;forget&lt;/code&gt;)&lt;/strong&gt;: 5 red herrings are hidden in the story. Delete gossip from your memory log to keep your graph clean and win the case!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🎯 Tell Dev (&lt;code&gt;solve&lt;/code&gt;)&lt;/strong&gt;: Reconstruct the timeline before noon to win in a burst of victory confetti!&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Code Repository ⭐
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/your-username/good-boy-amnesia" rel="noopener noreferrer"&gt;github.com/your-username/good-boy-amnesia&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How I Built It (Tech Stack) 🛠️
&lt;/h2&gt;

</description>
      <category>devchallenge</category>
      <category>ai</category>
      <category>gamedev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>From My Father's Agricultural Knowledge to a Voice AI for Farmers</title>
      <dc:creator>Reet Singh</dc:creator>
      <pubDate>Sat, 15 Aug 2026 16:12:54 +0000</pubDate>
      <link>https://dev.to/reet_singh_ee97da2986538e/from-my-fathers-agricultural-knowledge-to-a-voice-ai-for-farmers-56eh</link>
      <guid>https://dev.to/reet_singh_ee97da2986538e/from-my-fathers-agricultural-knowledge-to-a-voice-ai-for-farmers-56eh</guid>
      <description>&lt;p&gt;My father has a master's degree in agriculture. Growing up around someone who had studied the subject deeply made me notice that a farming question is rarely as small as it sounds.&lt;/p&gt;

&lt;p&gt;“Which crop should I grow?” can depend on soil, season, water, location, cost, and risk. A mark on a leaf might be harmless, or it might be the first sign of a problem that needs an expert. The useful answer is not the longest answer. It is the answer that understands the situation and helps someone decide what to do next.&lt;/p&gt;

&lt;p&gt;A friend of mine made this gap feel real in a different way. He had land, money to invest, and an idea for an agriculture-related business. What he did not have was fluency in the subject. He could search online, but he did not always know which question to ask, which source to trust, or when general advice was no longer enough.&lt;/p&gt;

&lt;p&gt;My father had the knowledge. My friend had the intent and the resources. Between them was a problem of access.&lt;/p&gt;

&lt;p&gt;That problem is larger than one conversation. The Government of India's &lt;a href="https://www.pib.gov.in/Pressreleaseshare.aspx?PRID=2050966&amp;amp;lang=2&amp;amp;reg=48" rel="noopener noreferrer"&gt;Digital Agriculture Mission&lt;/a&gt; describes the need for timely, reliable information and customised advisories for crop planning, crop health, pest management, and irrigation. Data may exist in many places, but a person standing in a field still needs a simple way to reach the right information.&lt;/p&gt;

&lt;p&gt;I kept returning to one thought: what if asking for farming help could feel less like operating software and more like speaking to someone who listens?&lt;/p&gt;

&lt;p&gt;That thought became &lt;strong&gt;Kisan Sahayak&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiw4buq4xkugc20egmffi.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%2Fiw4buq4xkugc20egmffi.png" alt="Kisan Sahayak in a live Hinglish conversation with weather and saved memory" width="799" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The assistant I wanted to build
&lt;/h2&gt;

&lt;p&gt;Kisan Sahayak is a browser and phone-based voice AI assistant for Indian farmers and people beginning an agricultural venture. A user can speak in English, Hindi, or Hinglish and ask about crops, soil, irrigation, local weather, or an emerging crop problem.&lt;/p&gt;

&lt;p&gt;The assistant can fetch live data, remember useful details with permission, place a controlled advisory call, create a human-help request, measure whether a conversation achieved its purpose, and transfer crop symptoms to a separate specialist agent.&lt;/p&gt;

&lt;p&gt;It is not meant to replace an agronomist. Its job is to shorten the distance between a spoken question and a safe next step. When it does not have reliable data, it should say so. When a case needs a specialist or a person, it should stop pretending to be enough.&lt;/p&gt;

&lt;p&gt;I built it during &lt;strong&gt;10 Days of Voice Agents — VoiceForBharat Edition&lt;/strong&gt;. Its speech is powered by &lt;strong&gt;Murf Falcon&lt;/strong&gt;. Murf describes Falcon 2 as a real-time speech model with roughly 100 ms time-to-first-audio and the ability to switch languages within a sentence, both of which matter in a conversation that may move naturally between Hindi and English. You can read the technical details in the &lt;a href="https://murf.ai/api/docs/text-to-speech-models/falcon-2" rel="noopener noreferrer"&gt;Falcon 2 documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The source code is available here: &lt;a href="https://github.com/Reet24-del/murf-livekit-starter" rel="noopener noreferrer"&gt;github.com/Reet24-del/murf-livekit-starter&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when a farmer speaks
&lt;/h2&gt;

&lt;p&gt;A voice assistant sounds like one system, but it is a chain of systems working quickly enough to feel like one conversation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Deepgram Nova-3&lt;/strong&gt; converts speech into text. The project uses multilingual recognition so the caller can speak English, Hindi, or a mixture of both. Deepgram documents its supported models and languages in its &lt;a href="https://developers.deepgram.com/docs/models-languages-overview" rel="noopener noreferrer"&gt;model overview&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Gemini&lt;/strong&gt; reads the latest request, conversation context, safety instructions, and available tools. It decides whether to answer, fetch data, ask for consent, or transfer control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Murf Falcon&lt;/strong&gt; converts the reply into speech. The main assistant uses the Anisha voice. The crop specialist uses Samar, so the caller can hear that a real handoff has happened.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LiveKit&lt;/strong&gt; carries the audio and manages the real-time agent session between the browser or phone and the Python backend. Its documentation describes the same sequential &lt;a href="https://docs.livekit.io/agents/models/pipelines/" rel="noopener noreferrer"&gt;STT–LLM–TTS pipeline&lt;/a&gt; used in this project.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Farmer speaks
     |
     v
LiveKit room
     |
     v
Deepgram STT ---&amp;gt; latest-turn language detection
     |                         |
     v                         v
Google Gemini &amp;lt;--- memory, tools, consent, safety rules
     |
     +---- routine question ----&amp;gt; Kisan Sahayak
     |
     +---- crop symptoms -------&amp;gt; Crop Problem Specialist
     |
     v
Murf Falcon TTS
     |
     v
The farmer hears the answer

Supporting services:
Open-Meteo -&amp;gt; live district weather
SQLite     -&amp;gt; consented memory, help requests, and call outcomes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This architecture gave me a useful separation of responsibilities. The language model handles conversation. Tools handle facts that can change. SQLite handles information that must survive after a call. The specialist handles a narrower class of problems. The frontend tells the user what the system is doing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ten days, one layer at a time
&lt;/h2&gt;

&lt;p&gt;The project did not begin with all of these abilities. Each daily task exposed a weakness in the version from the day before.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 1: Giving the idea a voice
&lt;/h3&gt;

&lt;p&gt;The first version had one goal: complete a live voice loop.&lt;/p&gt;

&lt;p&gt;I connected Deepgram speech-to-text, Gemini, Murf Falcon text-to-speech, and LiveKit transport. For the first time, I could speak into the browser and hear the assistant answer. During my local tests, the observed time-to-first-audio ranged from 137 ms to 263 ms. Those numbers are local observations, not a universal benchmark, because network, region, model, and device all affect perceived latency.&lt;/p&gt;

&lt;p&gt;The early success was exciting, but it also revealed a truth about voice products. A correct answer can still feel wrong if the pause before it is too long. Latency is part of the conversation design.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 2: Deciding who the agent should be
&lt;/h3&gt;

&lt;p&gt;A working voice loop is not yet an assistant. On Day 2, I gave Kisan Sahayak a clear role, tone, and boundary.&lt;/p&gt;

&lt;p&gt;It would answer only farming and local-weather questions. It would keep spoken replies short. It would never invent current market prices, subsidy details, pesticide doses, or long-range weather. Hindi replies would use Devanagari. English replies would remain English. Hinglish could stay in Roman script.&lt;/p&gt;

&lt;p&gt;I also tested hostile and out-of-scope prompts. This was where the project moved from “Can it answer?” to “Can it answer responsibly?” The biggest lesson was that refusal behavior must be designed with as much care as the happy path.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 3: Making the invisible conversation visible
&lt;/h3&gt;

&lt;p&gt;Voice interfaces can be confusing when the screen gives no feedback. Is the microphone active? Is the agent thinking? Has the session ended?&lt;/p&gt;

&lt;p&gt;I built a browser interface that shows clear states: ready, connecting, listening, thinking, speaking, transferring, and ended. I added a live transcript, a weather panel, saved memory, and controls that avoid ending a call through an accidental tap.&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%2Frqohn0r5p7e8myeuz1az.jpg" 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%2Frqohn0r5p7e8myeuz1az.jpg" alt="Kisan Sahayak voice portal showing the voice orb, live weather panel, saved memory, and call controls" width="800" height="578"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The interface uses a dark field-inspired visual language, but its main purpose is practical. A user should never have to guess whether the assistant heard them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 4: Building memory without taking ownership of the user's data
&lt;/h3&gt;

&lt;p&gt;The assistant could remember a conversation while the session was open, then forget everything when the user returned. Day 4 added persistent memory through SQLite.&lt;/p&gt;

&lt;p&gt;Kisan Sahayak can save a caller's name, district, crops, land size, irrigation type, preferred language, and a short summary. It saves new information only after permission. A direct instruction such as “Remember that my district is Lucknow” also counts as clear permission.&lt;/p&gt;

&lt;p&gt;This distinction became important:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conversation context helps during the current call.&lt;/li&gt;
&lt;li&gt;Stored memory helps during a future call.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The database stores selected facts, not the full conversation. Python's &lt;a href="https://docs.python.org/3/library/sqlite3.html" rel="noopener noreferrer"&gt;&lt;code&gt;sqlite3&lt;/code&gt; documentation&lt;/a&gt; describes SQLite as a lightweight disk-based database that does not require a separate server, which made it a good fit for a local challenge build. A deployed version would need encryption, authentication, retention rules, and stronger access controls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 5: Teaching the assistant to use real data
&lt;/h3&gt;

&lt;p&gt;The model once gave the wrong current time. That failure made the next design decision obvious: anything described as “current” must come from a current source.&lt;/p&gt;

&lt;p&gt;I added a function tool that fetches district weather from Open-Meteo and another that reads the system clock in the Asia/Kolkata timezone. The weather result includes its source time, current conditions, wind, temperature range, and rain probability. Open-Meteo documents the available current and forecast variables in its &lt;a href="https://open-meteo.com/en/docs" rel="noopener noreferrer"&gt;Weather Forecast API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The failure path mattered as much as the successful response. The weather request has a timeout. If the service is down or returns incomplete data, the assistant says that live weather is unavailable and refuses to guess.&lt;/p&gt;

&lt;p&gt;The tool description also mattered. The model decides whether to call a function from that description, so “use this for current weather, rain chance, temperature, wind, spraying, irrigation, sowing, or harvesting” produced better routing than a vague label such as “weather tool.”&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 6: Moving from browser conversations to outbound calls
&lt;/h3&gt;

&lt;p&gt;Some useful information should reach a farmer before they open a website. On Day 6, I added controlled outbound rain-advisory calls through LiveKit SIP, with Linphone or Twilio as the call provider.&lt;/p&gt;

&lt;p&gt;This feature includes rules that are easy to overlook in a demo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the recipient must have consented;&lt;/li&gt;
&lt;li&gt;the destination must be valid;&lt;/li&gt;
&lt;li&gt;calls are limited to 08:00–20:00 IST;&lt;/li&gt;
&lt;li&gt;saved opt-outs are honoured;&lt;/li&gt;
&lt;li&gt;the weather tool must run before a current advisory is spoken;&lt;/li&gt;
&lt;li&gt;failed, unanswered, or declined calls receive a controlled outcome.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hard part was not writing a dial command. It was connecting the SIP trunk, worker registration, dispatch rule, verified destination, and agent name without mixing credentials between services. Telephony made every configuration mismatch visible immediately.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 7: Knowing when to ask a human
&lt;/h3&gt;

&lt;p&gt;An AI assistant should not stretch every problem until it sounds solvable. I selected two situations for human help: serious or rapidly spreading crop damage, and market information that is missing or stale.&lt;/p&gt;

&lt;p&gt;The assistant first says what it plans to share: who needs help, what happened, what it checked, urgency, language, and the requested follow-up method. It then asks for a clear yes or no. If the caller declines, no request is created.&lt;/p&gt;

&lt;p&gt;After consent, the system stores a short redacted summary and returns a reference ID. It does not store passwords, OTPs, PINs, account numbers, or a full transcript.&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%2F893y0f4bdxrpz4aobj66.jpg" 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%2F893y0f4bdxrpz4aobj66.jpg" alt="Human help request dashboard showing reference ID, urgency, language, status, summary, checks, and follow-up method" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This day changed my understanding of escalation. “Contact an expert” is advice. A consented request with a reference ID and visible status is a workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 8: Measuring whether a call helped
&lt;/h3&gt;

&lt;p&gt;Before Day 8, I could see calls happen but could not answer a basic product question: did the conversation achieve anything?&lt;/p&gt;

&lt;p&gt;I defined success for Kisan Sahayak as one of four outcomes: farming guidance delivered, live weather delivered, an expert request created, or an outbound rain advisory delivered. A call that ends before one of those conditions is recorded as failed even when the software did not crash.&lt;/p&gt;

&lt;p&gt;The analytics dashboard reads real browser and SIP session records from SQLite. It shows total, successful, and failed calls, along with filters, trends, channels, languages, durations, and controlled failure categories. It stores no caller identity and no transcript.&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%2Fg96nec6doc7ya0yvtvp3.jpg" 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%2Fg96nec6doc7ya0yvtvp3.jpg" alt="Call analytics dashboard showing successful, total, and failed calls from real sessions" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This feature forced me to separate technical reliability from user success. A perfectly stable call in which the user leaves before receiving guidance is still a failed product outcome.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 9: Handing crop problems to a specialist agent
&lt;/h3&gt;

&lt;p&gt;The main assistant had accumulated weather, memory, time, safety, escalation, and general farming responsibilities. Crop symptom triage needed a narrower role.&lt;/p&gt;

&lt;p&gt;I created a separate &lt;strong&gt;Crop Problem Specialist&lt;/strong&gt;. Reports of leaf spots, curling, wilting, pests, disease, nutrient deficiency, or unexplained crop damage trigger the handoff. The main assistant announces the transfer. The website displays “Connecting you to the specialist.” The specialist then introduces itself in a different Murf voice and continues with a copy of the existing conversation, so the farmer does not have to repeat the problem.&lt;/p&gt;

&lt;p&gt;The specialist asks one focused question at a time, offers only low-risk first steps, and never claims a certain diagnosis from a voice description. LiveKit's &lt;a href="https://docs.livekit.io/agents/logic/agents-handoffs/" rel="noopener noreferrer"&gt;agents and handoffs guide&lt;/a&gt; supports this pattern by allowing a tool call to return another agent while preserving conversation context.&lt;/p&gt;

&lt;p&gt;The first version did not route correctly. Crop symptoms competed with the older human-escalation tool, so the assistant sometimes offered a human request instead of transferring the call. I fixed that by giving specialist-eligible turns deterministic priority and temporarily removing the escalation tool from that turn.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 10: Turning the build into something another person can use
&lt;/h3&gt;

&lt;p&gt;The final day was not another agent feature. It was the work of explaining the system honestly.&lt;/p&gt;

&lt;p&gt;I organised the repository, documented setup, checked that secrets and local caller data were excluded, added screenshots, and wrote down the failures that shaped the design. A public project is more useful when a reader can understand its limits, run it, and reproduce the important tests.&lt;/p&gt;

&lt;p&gt;The ten-day sequence also made the product progression clear:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Conversation
   -&amp;gt; character and guardrails
   -&amp;gt; visible interface
   -&amp;gt; consented memory
   -&amp;gt; live tools
   -&amp;gt; outbound reach
   -&amp;gt; human help
   -&amp;gt; measurable outcomes
   -&amp;gt; specialist handoff
   -&amp;gt; documented, reproducible project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The bugs that changed the design
&lt;/h2&gt;

&lt;p&gt;The useful lessons came from moments when the assistant behaved confidently but incorrectly.&lt;/p&gt;

&lt;h3&gt;
  
  
  English questions received Hindi answers
&lt;/h3&gt;

&lt;p&gt;The original prompt described a bilingual assistant, but the bilingual greeting and earlier context sometimes outweighed the caller's newest sentence. An English question could receive a Hindi answer.&lt;/p&gt;

&lt;p&gt;I moved language detection to every completed user turn. The latest turn now decides the response mode: English, Devanagari Hindi, or Roman-script Hinglish. Tests cover all three instead of checking only the opening greeting.&lt;/p&gt;

&lt;p&gt;The fix taught me that language is not a profile setting. In a multilingual conversation, it is live session state.&lt;/p&gt;

&lt;h3&gt;
  
  
  The assistant sounded current without having current access
&lt;/h3&gt;

&lt;p&gt;Knowing that a user is in India does not give a language model access to India's current clock. General weather knowledge is not today's weather either.&lt;/p&gt;

&lt;p&gt;Time and weather now sit behind tools. Each returned value carries a time or timezone, and each failure has a spoken fallback. This removed the most dangerous kind of voice-agent error: a made-up answer delivered with a natural voice.&lt;/p&gt;

&lt;h3&gt;
  
  
  The call ended while the user was still trying to speak
&lt;/h3&gt;

&lt;p&gt;Voice activity detection, turn detection, browser audio, silence timeouts, and session lifecycle all interact. In early runs, silence handling could mark the user away too quickly or the browser could disconnect before the final analytics record was written.&lt;/p&gt;

&lt;p&gt;I increased the away timeout, avoided automatic disconnect on silence, added controlled re-prompts, and finalised analytics through the session shutdown path. The lesson was practical: real-time state bugs rarely belong to one layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  The specialist and human-help paths collided
&lt;/h3&gt;

&lt;p&gt;Both features dealt with difficult crop problems, but they served different purposes. The specialist continues the AI conversation. Human escalation creates a request after consent. Without an ownership rule, the model could choose either.&lt;/p&gt;

&lt;p&gt;The final routing order is explicit. A crop symptom goes to the specialist first. Serious cases can later move to a human-help request, but only after the specialist path and only with permission.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to run Kisan Sahayak
&lt;/h2&gt;

&lt;p&gt;You will need Python 3.10–3.14, Node.js 20 or newer, &lt;code&gt;uv&lt;/code&gt;, pnpm 9 or newer, a LiveKit Cloud project, and API keys for Murf, Deepgram, and Google AI.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Clone and install
&lt;/h3&gt;



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

&lt;span class="nb"&gt;cd &lt;/span&gt;backend
uv &lt;span class="nb"&gt;sync
&lt;/span&gt;uv run python src/agent.py download-files

&lt;span class="nb"&gt;cd&lt;/span&gt; ../frontend
pnpm &lt;span class="nb"&gt;install
cd&lt;/span&gt; ..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Create private environment files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp &lt;/span&gt;backend/.env.example backend/.env.local
&lt;span class="nb"&gt;cp &lt;/span&gt;frontend/.env.example frontend/.env.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the following values to &lt;code&gt;backend/.env.local&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LIVEKIT_URL=
LIVEKIT_API_KEY=
LIVEKIT_API_SECRET=
MURF_API_KEY=
DEEPGRAM_API_KEY=
GOOGLE_API_KEY=
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The frontend needs the same LiveKit project and the explicit agent name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LIVEKIT_URL=
LIVEKIT_API_KEY=
LIVEKIT_API_SECRET=
AGENT_NAME=kisan-sahayak-primary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both &lt;code&gt;.env.local&lt;/code&gt; files are ignored by Git. Never publish API keys, SIP trunk IDs, phone numbers, caller records, or &lt;code&gt;backend/memory.db&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Start the application
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x start_app.sh
./start_app.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://localhost:3001" rel="noopener noreferrer"&gt;http://localhost:3001&lt;/a&gt;, select &lt;strong&gt;Start Call&lt;/strong&gt;, and allow microphone access. The frontend and backend must use the same LiveKit project and agent name.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Test the two agent routes
&lt;/h3&gt;

&lt;p&gt;Ask a routine question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is today's rain chance in Lucknow?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The main assistant should call the live weather tool and answer in English.&lt;/p&gt;

&lt;p&gt;Then begin another call and report a crop symptom:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My tomato leaves have black spots and are curling.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The main assistant should announce a transfer. The interface should display the specialist connection state, and the crop specialist should continue without asking you to repeat the symptom.&lt;/p&gt;

&lt;p&gt;End the calls and open &lt;a href="http://localhost:3001/call-analytics" rel="noopener noreferrer"&gt;http://localhost:3001/call-analytics&lt;/a&gt;. The total should increase, and each call should be classified from its real outcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Kisan Sahayak could change, and what comes next
&lt;/h2&gt;

&lt;p&gt;My friend's original difficulty was not a lack of ideas. It was the gap between an idea and informed action. Kisan Sahayak reduces that gap in a few specific ways.&lt;/p&gt;

&lt;p&gt;It lets someone begin with the words they already know. It remembers location and crop details after consent, so a returning user does not start from zero. It brings live weather into the same conversation as crop planning. It recognises when a problem belongs to a specialist. It also leaves a visible trail when a human request is created or a call fails to reach its goal.&lt;/p&gt;

&lt;p&gt;The current version remains a prototype. Its crop guidance should be strengthened with an agronomist-reviewed knowledge base. District-level mandi prices need a dependable live source and clear timestamps. Photo-assisted crop triage could add evidence that voice alone cannot provide. The local SQLite database should move to encrypted hosted storage with authentication and role-based access before public deployment. Finally, field testing across different accents, devices, and network conditions should shape the next round of changes.&lt;/p&gt;

&lt;p&gt;My father’s education reminds me how much context sits behind a reliable agricultural answer. My friend’s plan reminds me how difficult that context can be to reach when someone is starting out. Kisan Sahayak is my attempt to make the first step easier while preserving the point at which software should call a specialist or ask a person for help.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources and further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.pib.gov.in/Pressreleaseshare.aspx?PRID=2050966&amp;amp;lang=2&amp;amp;reg=48" rel="noopener noreferrer"&gt;Digital Agriculture Mission, Press Information Bureau, Government of India&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://murf.ai/api/docs/text-to-speech-models/falcon-2" rel="noopener noreferrer"&gt;Murf Falcon 2 documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.livekit.io/agents/models/pipelines/" rel="noopener noreferrer"&gt;LiveKit voice pipeline types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.livekit.io/agents/logic/agents-handoffs/" rel="noopener noreferrer"&gt;LiveKit agents and handoffs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.deepgram.com/docs/models-languages-overview" rel="noopener noreferrer"&gt;Deepgram models and languages overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://open-meteo.com/en/docs" rel="noopener noreferrer"&gt;Open-Meteo Weather Forecast API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3/library/sqlite3.html" rel="noopener noreferrer"&gt;Python &lt;code&gt;sqlite3&lt;/code&gt; documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Reet24-del/murf-livekit-starter" rel="noopener noreferrer"&gt;Kisan Sahayak source code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>voiceai</category>
      <category>ai</category>
      <category>python</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Last Light: The Demon Lord Awaits at Dawn</title>
      <dc:creator>Reet Singh</dc:creator>
      <pubDate>Fri, 19 Jun 2026 17:32:23 +0000</pubDate>
      <link>https://dev.to/reet_singh_ee97da2986538e/last-light-the-demon-lord-awaits-at-dawn-44ob</link>
      <guid>https://dev.to/reet_singh_ee97da2986538e/last-light-the-demon-lord-awaits-at-dawn-44ob</guid>
      <description>&lt;p&gt;Last Light is an intense, top-down survival arena shooter inspired by Alice in Borderland. The game is deeply tied to the Solstice theme of Light vs. Darkness and the passage of time.&lt;/p&gt;

&lt;p&gt;As a lone samurai, you are trapped in a 12-hour cycle (from 18:00 to 06:00). Your weapon is a "Spirit Slash" that relies entirely on Solar Energy. To survive the encroaching dark and the endless hordes of demons, you must constantly seek out golden "Sanctuaries" to recharge your light.&lt;/p&gt;

&lt;p&gt;As the hours tick by, the darkness grows stronger, and the arena itself evolves against you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;21:00 (The Walls Rise): Massive cursed barriers emerge, forcing you into a maze.&lt;/li&gt;
&lt;li&gt;00:00 (Midnight): Lethal, rotating lasers ignite across the arena.&lt;/li&gt;
&lt;li&gt;03:00 (Spirit Fading): The safe sanctuaries detach and begin moving erratically.&lt;/li&gt;
&lt;li&gt;05:00 (The Demon Lord): The final shadow descends.
The goal was to create a high-stakes, fast-paced game where the environment is just as deadly as the enemies, perfectly capturing the feeling of fighting through the longest, darkest night of the year to finally see the sun rise.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Video Demo&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/My0KjRLO1YM"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Code&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Reet24-del" rel="noopener noreferrer"&gt;
        Reet24-del
      &lt;/a&gt; / &lt;a href="https://github.com/Reet24-del/last-light" rel="noopener noreferrer"&gt;
        last-light
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Last Light: A June Solstice Survival Arena&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Last Light&lt;/strong&gt; is an intense, top-down survival arena shooter built for the June Solstice Game Jam. It features dynamic mechanics inspired by &lt;em&gt;Alice in Borderland&lt;/em&gt;, where the arena itself evolves to become your greatest enemy as the hours pass.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The Theme: Light, Darkness, and the Solstice&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;As the June Solstice arrives, the game explores the balance between light and darkness. You must constantly seek the golden "Light Zones" to recharge your solar weapon while fending off creatures of the dark. As the 12-hour cycle progresses, the darkness encroaches, and the arena becomes progressively more hostile.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The Mechanics&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Solar Weaponry:&lt;/strong&gt; Your weapon drains Solar Energy instead of ammo. You must stand in golden light zones to recharge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Map Evolution:&lt;/strong&gt; Over the course of 12 hours (waves), the arena evolves
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;09:00:&lt;/strong&gt; Massive neon walls rise from the ground, creating an impenetrable maze.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;12:00:&lt;/strong&gt; Lethal…&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Reet24-del/last-light" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;How I Built It&lt;br&gt;
I built the game entirely from scratch using React and HTML5 Canvas, with Vite as the build tool.&lt;/p&gt;

&lt;p&gt;Technical Highlights:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Custom Game Engine: Instead of using a heavy game framework like Phaser or Unity, I built a pure requestAnimationFrame loop inside a React useEffect. React handles the state management, HUD, and overlays (like the Turing minigame), while the Canvas API handles rendering thousands of particles, enemies, and complex hitboxes at 60 FPS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Map Evolution: I implemented dynamic rectCircleCollision and lineCircleCollision algorithms. This allowed me to spawn solid maze walls mid-game that block both player movement and enemy pathing, as well as sweeping lasers that deal precise damage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Twin-Stick Mobile Support: I wrote native Multi-Touch event listeners (touchstart, touchmove, touchend) to intercept mobile interactions. Dragging on the left half of the screen creates a dynamic virtual joystick for movement, while dragging on the right controls the samurai's slash angle. The canvas scales responsively to any viewport using CSS object-fit.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prize Categories&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I am submitting Last Light for the following bonus categories:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Best Google AI Usage: The hyper-realistic, dark futuristic arena background (the neon-lit floor grid) was generated entirely using Google's Imagen AI models. This gave the game a premium, Alice in Borderland visual aesthetic that perfectly matched the "Darkness" theme.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Best Ode to Alan Turing: In honor of Alan Turing's legendary code-breaking legacy at Bletchley Park, the game features a Spades-style decryption minigame during pivotal hours. Time completely freezes, and a "TURING DECRYPTION REQUIRED" overlay appears. Players must read an 8-bit binary tape and decrypt it into the correct decimal number before the demons consume them. This directly honors his contributions to algorithms and modern computing by making code-breaking a literal survival mechanic!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>devchallenge</category>
      <category>gamechallenge</category>
      <category>gamedev</category>
    </item>
  </channel>
</rss>
