<?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: Nihal Aboobacker</title>
    <description>The latest articles on DEV Community by Nihal Aboobacker (@nihal_aboobacker_adc8fccb).</description>
    <link>https://dev.to/nihal_aboobacker_adc8fccb</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%2F3988660%2F0c363927-6c39-4597-ac47-54d8be35b4d8.png</url>
      <title>DEV Community: Nihal Aboobacker</title>
      <link>https://dev.to/nihal_aboobacker_adc8fccb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nihal_aboobacker_adc8fccb"/>
    <language>en</language>
    <item>
      <title>Building Maya: An AI Assistant for Real Estate Lead Capture</title>
      <dc:creator>Nihal Aboobacker</dc:creator>
      <pubDate>Wed, 17 Jun 2026 09:03:40 +0000</pubDate>
      <link>https://dev.to/nihal_aboobacker_adc8fccb/building-maya-an-ai-assistant-for-real-estate-lead-capture-5d9c</link>
      <guid>https://dev.to/nihal_aboobacker_adc8fccb/building-maya-an-ai-assistant-for-real-estate-lead-capture-5d9c</guid>
      <description>&lt;p&gt;When real estate agencies lose leads, it's rarely because of a bad listing. It's because someone messages in at 11 PM asking about a property, and by the time an agent replies the next morning, that person has already moved on to three other agencies. As part of my freelance work at UPSERA, I wanted to see whether a lightweight AI assistant could close that gap — and that's how Maya came together.&lt;/p&gt;

&lt;p&gt;The problem I was solving for&lt;/p&gt;

&lt;p&gt;Most small and mid-sized real estate agencies don't have the staff to monitor inquiries around the clock. They also don't have the budget for an enterprise CRM with built-in chat automation. What they needed was something simpler: a chatbot that could sit on their website, answer basic property questions instantly, and — most importantly — capture lead details the moment someone showed interest, even outside business hours.&lt;/p&gt;

&lt;p&gt;Why Next.js and Groq's LLaMA&lt;/p&gt;

&lt;p&gt;I built Maya on Next.js, partly because it let me ship both the frontend chat widget and the backend API routes in a single codebase without standing up a separate server. For the language model itself, I went with Groq's hosted LLaMA model rather than a heavier API. Groq's inference speed turned out to matter more than I initially expected — when a visitor is testing whether a chatbot is "real" or just a scripted FAQ, response latency is often the deciding factor in whether they keep typing or bounce.&lt;/p&gt;

&lt;p&gt;Capturing leads without a CRM&lt;/p&gt;

&lt;p&gt;Rather than building a full backend with a database just for a demo-stage product, I wired Maya's lead capture directly into Google Sheets. Whenever a conversation reached a point where a visitor shared contact details or asked about a specific property, that information got written as a new row in a shared sheet in real time. For a small agency, this meant the owner could open a spreadsheet they already understood, instead of learning a new dashboard. It's not the most "enterprise" solution, but it matched how these businesses actually work, and that mattered more than technical elegance.&lt;/p&gt;

&lt;p&gt;Fixing a UI lag I didn't expect&lt;/p&gt;

&lt;p&gt;One issue that came up during testing was the chat interface feeling sluggish right after a message was sent — there was a noticeable pause before the typing indicator appeared. The cause turned out to be a synchronous API call blocking the UI thread while waiting on the model's response. I restructured the call to run as a background request, updating the interface optimistically the moment the user sent their message rather than waiting on the network round trip. That small change made the chat feel noticeably more responsive, even though the actual model latency hadn't changed at all — a good reminder that perceived performance and actual performance aren't the same problem.&lt;/p&gt;

&lt;p&gt;A custom event for external triggers&lt;/p&gt;

&lt;p&gt;Agencies often wanted a way to open the chatbot from buttons placed elsewhere on their site — a "Talk to Maya" button on a listing page, for instance — without that button needing to know anything about the chat widget's internal state. I solved this with a custom browser event, open-maya, dispatched on the window object. Any button anywhere on the page could fire this event, and the chat widget, listening independently, would open in response. This kept the two pieces of UI fully decoupled: the listing page didn't need a prop, a shared state manager, or even to know the chatbot existed as a component — it just needed to know the event name.&lt;/p&gt;

&lt;p&gt;What this taught me&lt;/p&gt;

&lt;p&gt;Building Maya as a freelancer rather than as a coursework project changed how I approached the trade-offs. A university assignment rewards the "correct" architecture; a client demo rewards whatever gets a real agency to say yes and then actually use the thing daily. Choosing Google Sheets over a database, optimizing for perceived speed over raw speed, and designing for non-technical site owners rather than other developers were all decisions shaped by that constraint. It's a different kind of engineering judgment than I get practicing algorithms for coursework, and it's the part of building real products I've found most useful to learn early.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>nextjs</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
