<?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: Aman Thakur</title>
    <description>The latest articles on DEV Community by Aman Thakur (@hey-amanthakur).</description>
    <link>https://dev.to/hey-amanthakur</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%2F480980%2F6aad7616-af21-4f41-b35a-5819bf5d8061.png</url>
      <title>DEV Community: Aman Thakur</title>
      <link>https://dev.to/hey-amanthakur</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hey-amanthakur"/>
    <language>en</language>
    <item>
      <title>🚀 Stop Rebuilding Chat Widgets: Add a Fully Customizable Chatbot to Any Website in Minutes</title>
      <dc:creator>Aman Thakur</dc:creator>
      <pubDate>Tue, 28 Jul 2026 10:57:34 +0000</pubDate>
      <link>https://dev.to/hey-amanthakur/stop-rebuilding-chat-widgets-add-a-fully-customizable-chatbot-to-any-website-in-minutes-1h8h</link>
      <guid>https://dev.to/hey-amanthakur/stop-rebuilding-chat-widgets-add-a-fully-customizable-chatbot-to-any-website-in-minutes-1h8h</guid>
      <description>&lt;p&gt;We've all seen those chatbot widgets on websites.&lt;/p&gt;

&lt;p&gt;Whether it's customer support, FAQs, AI assistants, or lead generation, almost every modern website has one.&lt;/p&gt;

&lt;p&gt;The problem?&lt;/p&gt;

&lt;p&gt;Integrating a chatbot is usually more complicated than it should be.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have to create floating widgets.&lt;/li&gt;
&lt;li&gt;Handle UI and animations.&lt;/li&gt;
&lt;li&gt;Manage sessions.&lt;/li&gt;
&lt;li&gt;Make it responsive.&lt;/li&gt;
&lt;li&gt;Configure themes.&lt;/li&gt;
&lt;li&gt;Connect it with your backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted something much simpler.&lt;/p&gt;

&lt;p&gt;So I built &lt;code&gt;@hey-amanthakur/chat-bot&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built It
&lt;/h2&gt;

&lt;p&gt;While working on projects, I repeatedly found myself rebuilding the same chatbot UI.&lt;/p&gt;

&lt;p&gt;Every project required:&lt;/p&gt;

&lt;p&gt;Floating launcher button&lt;br&gt;
Chat window&lt;br&gt;
Message rendering&lt;br&gt;
Responsive design&lt;br&gt;
Theme customization&lt;br&gt;
Backend integration&lt;/p&gt;

&lt;p&gt;Instead of copying code between projects, I decided to package everything into a reusable npm library.&lt;/p&gt;
&lt;h2&gt;
  
  
  ✨ Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🚀 Plug-and-play integration&lt;/li&gt;
&lt;li&gt;🎨 Fully customizable appearance&lt;/li&gt;
&lt;li&gt;📱 Mobile responsive out of the box&lt;/li&gt;
&lt;li&gt;⚡ Lightweight with minimal setup&lt;/li&gt;
&lt;li&gt;🔌 Connect to any backend or AI model&lt;/li&gt;
&lt;li&gt;🧩 Works with React, Next.js, Vue or Vanilla JavaScript&lt;/li&gt;
&lt;li&gt;💬 Floating chat widget with modern UI&lt;/li&gt;
&lt;li&gt;🌙 Theme support&lt;/li&gt;
&lt;li&gt;📦 Install from npm in seconds&lt;/li&gt;
&lt;li&gt;🛠️ Developer-friendly API
🎯 Production-ready&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most "AI chatbot" products for small businesses are SaaS platforms: sign up, wait for approval, pay monthly, get locked into their dashboard. I wanted something a developer could just &lt;code&gt;npm install&lt;/code&gt;, point at a business's info, and drop into a client's website the same afternoon.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;&lt;a href="https://www.npmjs.com/package/@hey-amanthakur/chat-bot" rel="noopener noreferrer"&gt;@hey-amanthakur/chat-bot&lt;/a&gt;&lt;/strong&gt; — an embeddable chatbot widget + backend that answers questions using &lt;em&gt;only&lt;/em&gt; a business's own services, hours, and FAQs. No database, no dashboard, no vendor lock-in.&lt;/p&gt;
&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;If you build websites for local businesses (dentists, salons, clinics, studios), you've probably been asked for a "chat with us" feature. Your options are usually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A generic support-widget SaaS that costs $30-100/mo and doesn't know anything about the business&lt;/li&gt;
&lt;li&gt;Building a custom bot from scratch with a vector DB, embeddings, and a whole backend&lt;/li&gt;
&lt;li&gt;Ignoring it and hoping the contact form is enough
I wanted a middle path: a small server you run yourself (or deploy anywhere), configured with plain JS objects, that any client site can embed with a single &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;

&lt;p&gt;Install it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @hey-amanthakur/chat-bot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configure and start the server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ChatBot&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@hey-amanthakur/chat-bot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;ChatBot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;openrouterKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sk-or-v1-xxxxx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;clients&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-business&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;My Business&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hi! How can I help you today?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Consultation&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$50&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Initial consultation&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;day&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Monday&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;open&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;9:00 AM&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;5:00 PM&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;faqs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;question&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Do you accept insurance?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Yes, we accept most major plans.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drop the widget into the client's HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script
  &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"http://localhost:3000/widgets/chat-widget.min.js"&lt;/span&gt;
  &lt;span class="na"&gt;data-client-id=&lt;/span&gt;&lt;span class="s"&gt;"my-business"&lt;/span&gt;
  &lt;span class="na"&gt;data-color=&lt;/span&gt;&lt;span class="s"&gt;"#2563eb"&lt;/span&gt;
  &lt;span class="na"&gt;data-icon=&lt;/span&gt;&lt;span class="s"&gt;"🦷"&lt;/span&gt;
  &lt;span class="na"&gt;data-header=&lt;/span&gt;&lt;span class="s"&gt;"Talk to us"&lt;/span&gt;
  &lt;span class="na"&gt;data-position=&lt;/span&gt;&lt;span class="s"&gt;"bottom-right"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it — a styled chat bubble shows up, and visitors can ask about pricing, hours, or anything in the FAQ.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why OpenRouter instead of hardcoding OpenAI
&lt;/h2&gt;

&lt;p&gt;The bot uses &lt;a href="https://openrouter.ai" rel="noopener noreferrer"&gt;OpenRouter&lt;/a&gt; under the hood, which means you're not locked into one model. Swap &lt;code&gt;model: 'openai/gpt-4o'&lt;/code&gt; for any supported model per client — some clients might be fine on a free/cheap model, others might want something stronger.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multiple clients on one server
&lt;/h2&gt;

&lt;p&gt;This was important for my use case: I build sites for multiple small businesses, and I didn't want to spin up a separate server for each one. One &lt;code&gt;ChatBot.start()&lt;/code&gt; call can serve several clients, each with its own isolated knowledge base and chat context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;ChatBot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;openrouterKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sk-or-v1-xxxxx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;clients&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dr-smith-dental&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Dr. Smith Dental&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;openai/gpt-4o&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Teeth Cleaning&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$120&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Professional cleaning&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;style-studio-salon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Style Studio Salon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Haircut&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$45&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Professional haircut&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each site just points its widget script at its own &lt;code&gt;data-client-id&lt;/code&gt;, and the bot only ever answers using that client's data — it won't leak Dr. Smith's pricing into Style Studio's chat window.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a message actually flows
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Widget loads → chat bubble renders on the page&lt;/li&gt;
&lt;li&gt;Visitor types a message → &lt;code&gt;POST /api/chat&lt;/code&gt; with &lt;code&gt;clientId&lt;/code&gt; + message&lt;/li&gt;
&lt;li&gt;Server loads that client's config (in-memory, no DB)&lt;/li&gt;
&lt;li&gt;A lightweight lead-detection check runs on the message

&lt;ul&gt;
&lt;li&gt;If it looks like a lead (someone asking to book, get a quote, etc.) → the bot nudges toward contact info&lt;/li&gt;
&lt;li&gt;Otherwise → the message goes to OpenRouter along with the client's services/hours/FAQs as context&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The model replies using &lt;em&gt;only&lt;/em&gt; that context&lt;/li&gt;
&lt;li&gt;Response renders in the widget with basic formatting
## Security basics, out of the box&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Since this thing is meant to be embedded on real client sites, I didn't want to ship it without the obvious guardrails:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The OpenRouter API key never reaches the browser — it stays server-side&lt;/li&gt;
&lt;li&gt;Rate limiting on every endpoint (20/min for chat, 10/min for lead submission)&lt;/li&gt;
&lt;li&gt;Input validation — 2000 char cap per message, 10KB body limit&lt;/li&gt;
&lt;li&gt;Configurable CORS per deployment via &lt;code&gt;allowedOrigins&lt;/code&gt;
## Customizing the widget&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The widget itself is just &lt;code&gt;data-*&lt;/code&gt; attributes, so you can reskin it per client without touching code:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-color&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#2563eb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bubble, header, and user message color&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-icon&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;chat bubble SVG&lt;/td&gt;
&lt;td&gt;Emoji, image URL, or raw SVG string&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-header&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Chat with us&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Header title&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-position&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bottom-right&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Any corner of the screen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-greeting&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Overrides the configured greeting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you'd rather not use a script tag (say, in a React or Vue app), there's also an ES module version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ChatWidget&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@hey-amanthakur/chat-bot/widget.esm&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ChatWidget&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-business&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;primaryColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#e11d48&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;💬&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headerTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Support Chat&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;top-right&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Server:&lt;/strong&gt; NestJS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Widget:&lt;/strong&gt; Vanilla TypeScript, bundled with Rollup (no framework dependency for the embed)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM:&lt;/strong&gt; OpenRouter (model-agnostic)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build:&lt;/strong&gt; Turborepo monorepo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests:&lt;/strong&gt; 73 unit tests + 15 E2E tests
## Try it
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @hey-amanthakur/chat-bot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;📦 &lt;a href="https://www.npmjs.com/package/@hey-amanthakur/chat-bot" rel="noopener noreferrer"&gt;npm package&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;a href="https://github.com/hey-amanthakur/chat-bot" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📄 MIT licensed
If you build sites for small/local businesses and want a chatbot you can actually own instead of renting from a SaaS, give it a try. Issues, stars, and feedback are all very welcome — this is still early, and I'd love to know what you build with it.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>The Software Engineering Job Market Has Changed. Most Candidates Haven't.</title>
      <dc:creator>Aman Thakur</dc:creator>
      <pubDate>Wed, 15 Jul 2026 16:46:45 +0000</pubDate>
      <link>https://dev.to/hey-amanthakur/the-software-engineering-job-market-has-changed-most-candidates-havent-1be5</link>
      <guid>https://dev.to/hey-amanthakur/the-software-engineering-job-market-has-changed-most-candidates-havent-1be5</guid>
      <description>&lt;p&gt;A few months ago, I started noticing a pattern.&lt;/p&gt;

&lt;p&gt;Every day, I would come across posts from talented developers saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I've applied to 500+ jobs."&lt;/p&gt;

&lt;p&gt;"I'm getting rejected without interviews."&lt;/p&gt;

&lt;p&gt;"I've built multiple projects, but nobody is responding."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The common assumption is that the market is bad.&lt;/p&gt;

&lt;p&gt;While that's partially true, I don't think that's the complete story.&lt;/p&gt;

&lt;p&gt;The software engineering landscape has fundamentally changed, and many candidates are still preparing for a market that no longer exists.&lt;/p&gt;




&lt;h2&gt;
  
  
  The New Reality
&lt;/h2&gt;

&lt;p&gt;There was a time when learning a framework, building a few portfolio projects, and solving interview questions consistently could land you interviews.&lt;/p&gt;

&lt;p&gt;Today, almost every applicant has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React, Angular, Vue, or Next.js experience.&lt;/li&gt;
&lt;li&gt;Node.js, Java, Python, or Go on their resume.&lt;/li&gt;
&lt;li&gt;Several GitHub repositories.&lt;/li&gt;
&lt;li&gt;A deployed portfolio.&lt;/li&gt;
&lt;li&gt;AI-assisted projects.&lt;/li&gt;
&lt;li&gt;ChatGPT helping with resumes and interview preparation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The baseline has risen.&lt;/p&gt;

&lt;p&gt;Having these skills is no longer a competitive advantage.&lt;/p&gt;

&lt;p&gt;They're simply the expectation.&lt;/p&gt;




&lt;h2&gt;
  
  
  AI Didn't Replace Engineers. It Changed What Companies Value.
&lt;/h2&gt;

&lt;p&gt;One of the biggest misconceptions today is that AI is replacing software engineers.&lt;/p&gt;

&lt;p&gt;That's not what I'm seeing.&lt;/p&gt;

&lt;p&gt;AI has dramatically reduced the effort required for routine implementation.&lt;/p&gt;

&lt;p&gt;Need a REST API?&lt;/p&gt;

&lt;p&gt;Generate it.&lt;/p&gt;

&lt;p&gt;Need authentication?&lt;/p&gt;

&lt;p&gt;Generate it.&lt;/p&gt;

&lt;p&gt;Need boilerplate code?&lt;/p&gt;

&lt;p&gt;Generate it.&lt;/p&gt;

&lt;p&gt;Need tests?&lt;/p&gt;

&lt;p&gt;AI can produce a reasonable first draft.&lt;/p&gt;

&lt;p&gt;The repetitive parts of software development have become significantly faster.&lt;/p&gt;

&lt;p&gt;But software engineering has never been only about writing code.&lt;/p&gt;

&lt;p&gt;The difficult parts remain the same:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Designing scalable systems.&lt;/li&gt;
&lt;li&gt;Making architectural trade-offs.&lt;/li&gt;
&lt;li&gt;Understanding business requirements.&lt;/li&gt;
&lt;li&gt;Debugging production issues.&lt;/li&gt;
&lt;li&gt;Optimizing performance.&lt;/li&gt;
&lt;li&gt;Ensuring security.&lt;/li&gt;
&lt;li&gt;Making engineering decisions under uncertainty.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are still human problems.&lt;/p&gt;

&lt;p&gt;And they're becoming even more valuable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Projects Alone Don't Stand Out Anymore
&lt;/h2&gt;

&lt;p&gt;This might be unpopular.&lt;/p&gt;

&lt;p&gt;Building projects is still important.&lt;/p&gt;

&lt;p&gt;But building &lt;strong&gt;another&lt;/strong&gt; Todo app, Netflix clone, ChatGPT wrapper, or e-commerce application is unlikely to make you memorable.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because today almost anyone can build those with AI assistance.&lt;/p&gt;

&lt;p&gt;The question recruiters are increasingly asking isn't:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can this person build a project?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead, it's:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can this person solve problems we actually have?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A project becomes interesting when it demonstrates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real users.&lt;/li&gt;
&lt;li&gt;Real engineering challenges.&lt;/li&gt;
&lt;li&gt;Performance optimizations.&lt;/li&gt;
&lt;li&gt;Scalability decisions.&lt;/li&gt;
&lt;li&gt;Monitoring.&lt;/li&gt;
&lt;li&gt;Deployment.&lt;/li&gt;
&lt;li&gt;Security considerations.&lt;/li&gt;
&lt;li&gt;Lessons learned.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The implementation matters less than the thinking behind it.&lt;/p&gt;




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

&lt;p&gt;Another challenge isn't technical.&lt;/p&gt;

&lt;p&gt;It's visibility.&lt;/p&gt;

&lt;p&gt;A single job posting can receive hundreds or even thousands of applications within days.&lt;/p&gt;

&lt;p&gt;That means many qualified candidates never even receive a phone screen.&lt;/p&gt;

&lt;p&gt;It's not always because they aren't good enough.&lt;/p&gt;

&lt;p&gt;Sometimes their resume simply wasn't seen.&lt;/p&gt;

&lt;p&gt;Sometimes they lacked a referral.&lt;/p&gt;

&lt;p&gt;Sometimes timing worked against them.&lt;/p&gt;

&lt;p&gt;This is frustrating—but it's the reality of a saturated hiring market.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cold DMs Rarely Work
&lt;/h2&gt;

&lt;p&gt;Many candidates try to solve this by sending messages like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Hi, can you refer me?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unfortunately, most of these messages never receive a response.&lt;/p&gt;

&lt;p&gt;Not because people are rude.&lt;/p&gt;

&lt;p&gt;Because they receive dozens of similar requests every week.&lt;/p&gt;

&lt;p&gt;Networking isn't about collecting referrals.&lt;/p&gt;

&lt;p&gt;It's about building relationships before you need help.&lt;/p&gt;

&lt;p&gt;Contribute to discussions.&lt;/p&gt;

&lt;p&gt;Share what you're learning.&lt;/p&gt;

&lt;p&gt;Help others.&lt;/p&gt;

&lt;p&gt;Write technical content.&lt;/p&gt;

&lt;p&gt;Participate in open source.&lt;/p&gt;

&lt;p&gt;People are far more willing to refer someone they recognize than someone they've never interacted with.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Makes Engineers Stand Out in 2026?
&lt;/h2&gt;

&lt;p&gt;If coding has become easier, then what actually differentiates engineers?&lt;/p&gt;

&lt;p&gt;From what I've observed, companies increasingly value people who can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Design systems instead of just implementing them.&lt;/li&gt;
&lt;li&gt;Explain technical decisions clearly.&lt;/li&gt;
&lt;li&gt;Work across product and engineering.&lt;/li&gt;
&lt;li&gt;Debug complex issues.&lt;/li&gt;
&lt;li&gt;Understand trade-offs.&lt;/li&gt;
&lt;li&gt;Learn quickly.&lt;/li&gt;
&lt;li&gt;Use AI effectively without depending entirely on it.&lt;/li&gt;
&lt;li&gt;Take ownership from idea to production.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Coding remains essential.&lt;/p&gt;

&lt;p&gt;But coding alone is no longer enough.&lt;/p&gt;




&lt;h2&gt;
  
  
  Advice for Developers Looking for Jobs
&lt;/h2&gt;

&lt;p&gt;If you're currently applying and not getting responses, don't immediately assume you're not good enough.&lt;/p&gt;

&lt;p&gt;Instead, ask yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Am I solving problems or just building tutorials?&lt;/li&gt;
&lt;li&gt;Can I explain &lt;em&gt;why&lt;/em&gt; I designed something a certain way?&lt;/li&gt;
&lt;li&gt;Do I understand system design?&lt;/li&gt;
&lt;li&gt;Can I communicate my decisions?&lt;/li&gt;
&lt;li&gt;Am I using AI as a productivity tool rather than letting it think for me?&lt;/li&gt;
&lt;li&gt;Does my resume show impact rather than technologies?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The answers to these questions often matter more than adding another framework to your resume.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The job market is undeniably tougher than it was a few years ago.&lt;/p&gt;

&lt;p&gt;But I don't believe software engineering is dying.&lt;/p&gt;

&lt;p&gt;It's evolving.&lt;/p&gt;

&lt;p&gt;The role is shifting away from simply writing code toward designing systems, making informed decisions, collaborating effectively, and solving meaningful problems.&lt;/p&gt;

&lt;p&gt;AI is accelerating development.&lt;/p&gt;

&lt;p&gt;It isn't eliminating the need for thoughtful engineers.&lt;/p&gt;

&lt;p&gt;The developers who adapt to this shift won't just survive—they'll become significantly more valuable.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What changes have you noticed in the hiring process over the last couple of years?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear perspectives from both candidates and hiring managers.&lt;/p&gt;

</description>
      <category>career</category>
      <category>interview</category>
      <category>programming</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>From a CMS in a College Dorm to Full Stack Engineering: My First Two Years in Tech</title>
      <dc:creator>Aman Thakur</dc:creator>
      <pubDate>Sun, 12 Jul 2026 04:40:32 +0000</pubDate>
      <link>https://dev.to/hey-amanthakur/from-a-cms-in-a-college-dorm-to-full-stack-engineering-my-first-two-years-in-tech-49p5</link>
      <guid>https://dev.to/hey-amanthakur/from-a-cms-in-a-college-dorm-to-full-stack-engineering-my-first-two-years-in-tech-49p5</guid>
      <description>&lt;p&gt;I still remember the first time I saw a production bug crash right in front of a client, live, during a demo. My hands went cold. That was in 2021, during my internship at Deep Info Lab, and it taught me more about engineering in five minutes than any semester of college had.&lt;/p&gt;

&lt;p&gt;This is the story of how I got from there to here — not a highlight reel, but the actual path, mistakes included.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it started: a CMS and a lot of late nights
&lt;/h2&gt;

&lt;p&gt;I built my first real production feature as an intern — a Content Management System using Django Rest Framework and React. It sounds simple written out like that. It wasn't. I was learning JWT authentication, request routing, and Nginx configuration at the same time as I was supposed to be &lt;em&gt;shipping&lt;/em&gt; the thing.&lt;/p&gt;

&lt;p&gt;What I remember most isn't the tech stack, though. It's the moment our CEO personally acknowledged the work. That's when something clicked for me: good engineering isn't about knowing every tool going in. It's about being willing to sit with the discomfort of not knowing, and figuring it out anyway, on a deadline, with people depending on you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning that frontend and backend aren't separate worlds
&lt;/h2&gt;

&lt;p&gt;At floc, I stepped into Flutter and Firebase to build a real-time social discovery app. It was my first time owning something end-to-end — design, auth, testing, deployment. I set up CI/CD with Docker and GitHub Actions for the first time, mostly by trial, error, and an unreasonable number of tabs open on Stack Overflow.&lt;/p&gt;

&lt;p&gt;Looking back, this was the internship where I stopped thinking of myself as "a frontend person" or "a backend person." I was just someone trying to make something work end to end. That mental shift mattered more than any specific skill I picked up.&lt;/p&gt;

&lt;h2&gt;
  
  
  The projects that actually taught me to think in systems
&lt;/h2&gt;

&lt;p&gt;Smarter.Codes had me building data analytics interfaces — dashboards that had to make sense of messy business data at a glance. Smarter.Codes had me shipping across three different production products simultaneously: Hybrid.Chat, NayakAI, and TalkingDB. Different codebases, different constraints, same underlying question every time: how do you build something that won't fall apart in six months?&lt;/p&gt;

&lt;p&gt;This is where I really started caring about architecture. I refactored backend logic chains that had grown so nested nobody wanted to touch them. I built an NLP pipeline that had to parse multi-turn conversations and pull structured meaning out of them. None of it was glamorous. All of it taught me that the unglamorous work — the refactor nobody asked for, the test suite nobody wanted to write — is usually the work that actually matters a year later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I am now
&lt;/h2&gt;

&lt;p&gt;Today, at eQ Technologic, I spend my time on things that would have felt out of reach two years ago: leading refactors across legacy modules, building internal tooling that other engineers rely on, sitting in sprint planning and actually having opinions worth sharing. I've gone from being the person asking "how do I even start this" to being someone junior engineers sometimes ask that question to.&lt;/p&gt;

&lt;p&gt;I'm not writing this because I think I've figured it all out. I'm writing it because two years ago, I would have loved to read something like this — not a highlight reel, just an honest account of what the climb actually looks like.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd tell someone starting out
&lt;/h2&gt;

&lt;p&gt;A few things I wish someone had told me directly, instead of me learning them the hard way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The unglamorous work is often the most valuable work. Nobody hands out awards for a clean refactor, but everyone feels the pain when it doesn't happen.&lt;/li&gt;
&lt;li&gt;Ownership matters more than expertise. I learned more from owning a feature I didn't fully understand than from being handed tasks in a domain I already knew.&lt;/li&gt;
&lt;li&gt;Ask for the "why," not just the "how." Understanding why a system is built a certain way will teach you system design faster than any course will.&lt;/li&gt;
&lt;li&gt;Ship on a deadline, then go back and make it better. Perfection before shipping is usually just fear wearing a productivity costume.
I'm currently exploring SDE 2 opportunities where I can keep building on this — deeper system design, more ownership, more mentoring. If any part of this journey resonates with you, or you're earlier in yours and want to compare notes, I'd love to hear from you.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;I'm Aman Thakur, a Full Stack Software Engineer working with React.js, Node.js, and NestJS. You can find me on &lt;a href="https://www.linkedin.com/in/aman-thakur" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or &lt;a href="https://github.com/hey-amanthakur" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>career</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
