<?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: Abhinav Gupta</title>
    <description>The latest articles on DEV Community by Abhinav Gupta (@egoisticcoder).</description>
    <link>https://dev.to/egoisticcoder</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%2F4027326%2F384b2f6f-ce01-437a-ad64-486de51671f7.png</url>
      <title>DEV Community: Abhinav Gupta</title>
      <link>https://dev.to/egoisticcoder</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/egoisticcoder"/>
    <language>en</language>
    <item>
      <title>StudyMate AI</title>
      <dc:creator>Abhinav Gupta</dc:creator>
      <pubDate>Mon, 13 Jul 2026 18:03:12 +0000</pubDate>
      <link>https://dev.to/egoisticcoder/studymate-ai-nm0</link>
      <guid>https://dev.to/egoisticcoder/studymate-ai-nm0</guid>
      <description>&lt;h1&gt;
  
  
  StudyMate AI: Building a Voice-First Adaptive Learning Engine That Actually Knows When a Student Is Struggling
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;A HackHazards '26 submission&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Most "AI tutoring" apps are chatbots wearing a mortarboard. They answer questions when asked, but they have no memory of &lt;em&gt;how&lt;/em&gt; a student learns over time — whether a topic that was "mastered" last week is quietly decaying, whether a student is avoiding a chapter because it's hard or because they're bored, or whether a right answer today was actually a lucky guess.&lt;/p&gt;

&lt;p&gt;For ICSE/CBSE students specifically, this matters a lot. The syllabus is dense, exam cycles are unforgiving, and the difference between a B and an A often comes down to catching a weak concept three weeks before the test instead of the night before. I built StudyMate AI to solve that: not another Q&amp;amp;A bot, but a system that tracks a student's cognitive state over time and adapts accordingly — using voice as the primary interface, because most students don't want to type out a doubt at 11 PM, they want to just ask.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Expo (React Native) — cross-platform mobile-first, single codebase for Android/iOS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Behavioral graph engine:&lt;/strong&gt; Neo4j AuraDB — students, topics, attempts, and mastery states modeled as a graph rather than flat rows, with 8-thread parallel Cypher queries to keep classification fast at scale&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM layer:&lt;/strong&gt; Groq (Llama-3) — sub-second inference for tutoring responses and doubt-solving&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice:&lt;/strong&gt; Sarvam AI — Bulbul V3 for TTS, Saaras for STT, chosen specifically for Indian-language and accent robustness over generic Whisper/ElevenLabs pipelines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-device retrieval:&lt;/strong&gt; SQLite-backed RAG — so recently studied material stays queryable even with a flaky connection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spaced repetition:&lt;/strong&gt; Ebbinghaus forgetting-curve scheduling to decide what gets resurfaced and when&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; Web build live at studymatev3web.vercel.app&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Partner Track
&lt;/h2&gt;

&lt;p&gt;Sarvam AI — StudyMate leans on Bulbul V3 and Saaras specifically because generic Western TTS/STT stacks handle Indian English and code-switched speech (Hindi-English mixing mid-sentence, which is how most ICSE/CBSE students actually talk) noticeably worse. This wasn't a checkbox integration; voice quality directly determines whether a student trusts the tutor enough to keep using it. StudyMate was subsequently accepted into the Sarvam Startup Program on the strength of this integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation: The Part Nobody Talks About — Student State Modeling
&lt;/h2&gt;

&lt;p&gt;The core design decision was refusing to treat "correct/incorrect" as the only signal. Every attempt a student makes updates a behavioral graph in Neo4j, and each student gets classified into one of four states per topic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mastering&lt;/strong&gt; — consistent correct answers, stable or improving response time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Underperforming&lt;/strong&gt; — attempting the topic but accuracy is below threshold&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoiding&lt;/strong&gt; — the topic exists in the syllabus graph but has abnormally low attempt frequency relative to how close the exam is&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Struggling&lt;/strong&gt; — high attempt frequency, low accuracy, increasing time-per-question (a signal of frustration, not just difficulty)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why a graph database made more sense than a relational one: mastery isn't a single row's property, it's a relationship between a student node, a topic node, and a time-decayed weight on the edge between them. Cypher queries traverse these relationships to answer questions like "which topics is this student avoiding that are also prerequisites for a topic they're struggling with" — a query that's painful in SQL and natural in a graph.&lt;/p&gt;

&lt;p&gt;The 8-thread parallel Cypher execution exists because classification has to run across the &lt;em&gt;entire&lt;/em&gt; topic graph for a student on every session start, not just the topic they're currently on — otherwise the spaced-repetition scheduler doesn't know what to resurface.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Expo/Node dependency hell.&lt;/strong&gt; Mid-development, the app started throwing &lt;code&gt;MODULE_NOT_FOUND&lt;/code&gt; on SDK 54. The instinct is to assume an SDK/Node version mismatch (Node v26.4.0 was a live suspect), but the actual root cause was stale &lt;code&gt;node_modules&lt;/code&gt; from an earlier Expo version — a full reinstall resolved it. The lesson: don't assume the exotic explanation before ruling out the boring one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Voice pipeline latency under load.&lt;/strong&gt; Chaining STT → LLM → TTS naively introduces enough round-trip latency that a "voice-first" tutor starts to feel laggy and unnatural. Getting this to feel conversational required treating the pipeline as three independently optimizable stages rather than one black box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avoiding false "mastery."&lt;/strong&gt; Early versions of the classification logic over-rewarded speed, which meant a student who guessed quickly and got lucky could get marked "Mastering." The fix was weighting classification against variance in response pattern, not just accuracy — a lucky guess looks statistically different from real recall even when both are "correct."&lt;/p&gt;

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

&lt;p&gt;The HackHazards submission (README, Gamma pitch deck, CodeRabbit-reviewed codebase) is the checkpoint, not the finish line. With Sarvam Startup Program backing, the next phase is expanding the topic graph's coverage and tightening the avoidance-detection heuristics, since that signal — a student silently avoiding a topic — is the one traditional apps miss entirely and the one that actually predicts exam-day surprises.&lt;/p&gt;




&lt;p&gt;*Built for HackHazards '26. Live demo: &lt;/p&gt;

</description>
      <category>ai</category>
      <category>education</category>
      <category>nlp</category>
      <category>showdev</category>
    </item>
    <item>
      <title>NeoPet: An AI Virtual Pet That Talks Back</title>
      <dc:creator>Abhinav Gupta</dc:creator>
      <pubDate>Mon, 13 Jul 2026 13:22:18 +0000</pubDate>
      <link>https://dev.to/egoisticcoder/neopet-an-ai-virtual-pet-that-talks-back-470c</link>
      <guid>https://dev.to/egoisticcoder/neopet-an-ai-virtual-pet-that-talks-back-470c</guid>
      <description>&lt;h1&gt;
  
  
  NeoPet: An AI Virtual Pet That Talks Back — From X Celsior '26 Win to HackHazards '26
&lt;/h1&gt;

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

&lt;p&gt;Virtual pets have existed since Tamagotchi, but they've always been dumb state machines: feed it, it's happy; ignore it, it's sad. There's no actual interaction — just a hunger bar pretending to be a relationship. I wanted to build a virtual pet that a user could genuinely &lt;em&gt;talk to&lt;/em&gt; — one with a persistent personality, real conversational memory, and a voice, rather than a sprite that reacts to button presses.&lt;/p&gt;

&lt;p&gt;NeoPet started as a submission for X Celsior '26, where it won first place, and was later cleaned up and resubmitted as a secondary project for HackHazards '26 alongside StudyMate AI, since both projects share a philosophy: AI interfaces should feel like a conversation, not a menu.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend/Framework:&lt;/strong&gt; Next.js — server-side rendering for fast initial loads and clean routing between pet states/screens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend &amp;amp; persistence:&lt;/strong&gt; Firebase — auth, real-time database for pet state (mood, stats, conversation history), and hosting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM layer:&lt;/strong&gt; Groq (LLM inference) — powers the pet's personality and conversational responses with low enough latency to feel like a real-time chat rather than a loading spinner&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice output:&lt;/strong&gt; ElevenLabs TTS — gives the pet an actual distinct voice rather than generic robotic TTS, which matters enormously for something meant to feel like a companion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice input:&lt;/strong&gt; Web Speech API — browser-native STT, kept lightweight since this is a web app and didn't need a heavier custom pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementation
&lt;/h2&gt;

&lt;p&gt;The core architecture treats the pet as a stateful character, not a stateless chatbot wrapper. Every conversation turn updates persisted state in Firebase — mood, recent topics discussed, "relationship" progress — which then gets fed back into the LLM prompt on the next turn so the pet's responses stay consistent with its established personality and history, instead of resetting to a blank slate every message.&lt;/p&gt;

&lt;p&gt;The voice loop (Web Speech API for input, ElevenLabs for output) was the deliberate design centerpiece: talking &lt;em&gt;to&lt;/em&gt; a pet and having it respond &lt;em&gt;in a distinct voice&lt;/em&gt; is what makes it feel alive versus reading text in a chat bubble. Getting Groq's response speed low enough that the ElevenLabs TTS call didn't introduce an awkward silence between "user finishes talking" and "pet starts responding" was the main engineering focus — a virtual pet that pauses for two seconds before speaking breaks the illusion immediately.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Making the pet feel consistent, not just responsive.&lt;/strong&gt; An LLM without persisted context will happily contradict itself between sessions — remembering nothing about a prior conversation. Solving this meant treating Firebase not just as a stats database but as the pet's actual memory: summarizing recent interactions and injecting that summary into the system prompt so the pet "remembers" the user across sessions rather than greeting them like a stranger every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Latency stacking across three services.&lt;/strong&gt; STT (browser) → LLM (Groq) → TTS (ElevenLabs) is three network round-trips before the pet can "speak." Each individually is fast, but stacked naively they add up to something that feels laggy. This pushed toward starting the TTS request as soon as a usable chunk of the LLM response was available rather than waiting for the full response to complete.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scope discipline.&lt;/strong&gt; It's easy for a virtual pet project to sprawl into a dozen half-finished mechanics (feeding, mini-games, customization). The version that won X Celsior '26 deliberately cut everything that wasn't in service of the core loop: talk to the pet, have it respond in character, in voice, with memory. Everything else got left for a later phase rather than diluting the demo.&lt;/p&gt;

&lt;h2&gt;
  
  
  From X Celsior to HackHazards
&lt;/h2&gt;

&lt;p&gt;Winning X Celsior '26 validated the core concept, but the HackHazards '26 resubmission wasn't just a re-upload — it involved cleaning up the README, restructuring the project description into Devpost's format, and presenting it as a secondary, complementary project to StudyMate: two different applications of the same underlying belief, that AI products should feel conversational and persistent rather than transactional.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;1st place, X Celsior '26. Submitted as a secondary project for HackHazards '26.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>software</category>
    </item>
  </channel>
</rss>
