<?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: Maha Darshini</title>
    <description>The latest articles on DEV Community by Maha Darshini (@maha_06).</description>
    <link>https://dev.to/maha_06</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%2F1853743%2F58b35a53-82c6-4280-b9cb-bfaebb79fe65.png</url>
      <title>DEV Community: Maha Darshini</title>
      <link>https://dev.to/maha_06</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maha_06"/>
    <language>en</language>
    <item>
      <title>The Password Reset That Worked Until It Had to Send an Email</title>
      <dc:creator>Maha Darshini</dc:creator>
      <pubDate>Thu, 20 Aug 2026 10:32:28 +0000</pubDate>
      <link>https://dev.to/maha_06/the-password-reset-that-worked-until-it-had-to-send-an-email-143i</link>
      <guid>https://dev.to/maha_06/the-password-reset-that-worked-until-it-had-to-send-an-email-143i</guid>
      <description>&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%2Fbpw3rn2vhyv6cpepxbl3.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%2Fbpw3rn2vhyv6cpepxbl3.png" alt="Email sending notification" width="352" height="65"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The plan was straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend
   ↓
Backend API
   ↓
PostgreSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Signup, login, JWT, refresh tokens, forgot password, reset password.&lt;/p&gt;

&lt;p&gt;But getting all of it working exposed a chain of bugs that taught us much more about debugging than simply implementing the feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  The First Crash: Duplicate Spring Beans
&lt;/h2&gt;

&lt;p&gt;The backend wouldn't even start.&lt;/p&gt;

&lt;p&gt;The first error was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ConflictingBeanDefinitionException:
Annotation-specified bean name 'AIResponseParser'
conflicts with existing bean definition
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There were two different classes with the same name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;com.investmentai.ai.util.AIResponseParser
com.investmentai.ai.parser.AIResponseParser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both were registered as Spring components.&lt;/p&gt;

&lt;p&gt;Instead of randomly deleting one, we searched the project for every reference:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;src\main\java&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Recurse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="nf"&gt;java&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Select-String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Pattern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AIResponseParser"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That helped us identify which implementation was actually being used.&lt;/p&gt;

&lt;p&gt;After resolving the duplicate, we tried again.&lt;/p&gt;

&lt;p&gt;And got another duplicate bean.&lt;/p&gt;




&lt;h2&gt;
  
  
  Round Two: Another Duplicate Bean
&lt;/h2&gt;

&lt;p&gt;This time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ConflictingBeanDefinitionException:
Annotation-specified bean name 'tokenValidator'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There were two classes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ai.security.TokenValidator
ai.validator.TokenValidator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They had completely different responsibilities, but Spring derived the same default bean name from both classes.&lt;/p&gt;

&lt;p&gt;Again, we searched for usages before changing anything.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Don't fix a startup error blindly. First understand why both components exist and where they're being used.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After resolving this conflict, the backend finally started.&lt;/p&gt;




&lt;h2&gt;
  
  
  🗄️ Next Problem: Database Configuration
&lt;/h2&gt;

&lt;p&gt;The authentication system depended on PostgreSQL running through Docker.&lt;/p&gt;

&lt;p&gt;We verified the container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;compose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ps&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then verified the database directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;compose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;postgres&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;psql&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-U&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;myuser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mydatabase&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And checked the tables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flyway_schema_history
refresh_tokens
users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helped separate the problem into two independent parts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application configuration
        ↓
Database connectivity
        ↓
Database schema
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of assuming the database was broken, we tested it independently.&lt;/p&gt;

&lt;p&gt;That made debugging much easier.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔐 Finally: Signup and Login
&lt;/h2&gt;

&lt;p&gt;Once the backend was stable, we tested signup directly through the API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /auth/signup
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The user was successfully created.&lt;/p&gt;

&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /auth/login
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;returned a JWT access token.&lt;/p&gt;

&lt;p&gt;We also verified that the user was actually stored in PostgreSQL.&lt;/p&gt;

&lt;p&gt;At this point, the core authentication flow was working:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Signup
   ↓
PostgreSQL
   ↓
Login
   ↓
JWT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But authentication still had one major feature left.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forgot password.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔑 Building the Password Reset Flow
&lt;/h2&gt;

&lt;p&gt;We created a dedicated password reset token table.&lt;/p&gt;

&lt;p&gt;The important part of the design was that we &lt;strong&gt;didn't store the raw reset token in the database&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The flow was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User requests password reset
          ↓
Generate random token
          ↓
Hash token
          ↓
Store hash in PostgreSQL
          ↓
Send raw token through email
          ↓
User clicks reset link
          ↓
Validate token
          ↓
Update password
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We also tracked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;expiration&lt;/li&gt;
&lt;li&gt;whether the token was already used&lt;/li&gt;
&lt;li&gt;the associated user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The database migration was applied successfully.&lt;/p&gt;

&lt;p&gt;The reset link was generated correctly.&lt;/p&gt;

&lt;p&gt;The reset page opened correctly.&lt;/p&gt;

&lt;p&gt;Everything looked good.&lt;/p&gt;

&lt;p&gt;Except...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;the email never arrived.&lt;/strong&gt;&lt;/p&gt;




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

&lt;p&gt;We initially used Gmail SMTP.&lt;/p&gt;

&lt;p&gt;The configuration looked normal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;spring.mail.host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;smtp.gmail.com&lt;/span&gt;
&lt;span class="py"&gt;spring.mail.port&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;587&lt;/span&gt;
&lt;span class="py"&gt;spring.mail.properties.mail.smtp.auth&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;spring.mail.properties.mail.smtp.starttls.enable&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the backend returned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;535-5.7.8 Username and Password not accepted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was interesting because the application could successfully connect to Gmail's SMTP server.&lt;/p&gt;

&lt;p&gt;The failure was happening specifically during authentication.&lt;/p&gt;

&lt;p&gt;We checked the environment variables.&lt;/p&gt;

&lt;p&gt;We checked the App Password.&lt;/p&gt;

&lt;p&gt;We checked the SMTP configuration.&lt;/p&gt;

&lt;p&gt;We eventually realised that relying on a local &lt;code&gt;.env&lt;/code&gt; file did not automatically make those variables available to the Spring Boot process.&lt;/p&gt;

&lt;p&gt;That was another useful lesson:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A configuration file existing in your project doesn't necessarily mean your application is actually receiving those values.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔄 Changing the Approach
&lt;/h2&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%2Fr2akfk001ppxyc5qqvsd.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%2Fr2akfk001ppxyc5qqvsd.png" alt="Now the email is sent and shown in command prompt" width="453" height="137"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We replaced:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Spring Boot
    ↓
Gmail SMTP
    ↓
Authentication failure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Spring Boot
    ↓
Email API
    ↓
User's inbox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part was that we &lt;strong&gt;didn't rewrite the password-reset logic&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The existing service still did:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sendPasswordResetEmail&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getEmail&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;resetUrl&lt;/span&gt;
&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only the implementation of &lt;code&gt;EmailService&lt;/code&gt; changed.&lt;/p&gt;

&lt;p&gt;This was a good example of why separating business logic from infrastructure matters.&lt;/p&gt;

&lt;p&gt;The authentication service shouldn't care whether an email is delivered through SMTP or an API.&lt;/p&gt;




&lt;h1&gt;
  
  
  🎯 The Final Test
&lt;/h1&gt;

&lt;p&gt;We triggered:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /auth/forgot-password
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ol&gt;
&lt;li&gt;Found the user.&lt;/li&gt;
&lt;li&gt;Generated a reset token.&lt;/li&gt;
&lt;li&gt;Stored the token hash.&lt;/li&gt;
&lt;li&gt;Created the reset URL.&lt;/li&gt;
&lt;li&gt;Sent the email through the new email service.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And finally:&lt;br&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%2Fld1x25a139txludgjyc2.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%2Fld1x25a139txludgjyc2.png" alt="reset password link is sent to the mail" width="595" height="227"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📩 &lt;strong&gt;The reset email arrived.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The user clicked the link.&lt;/p&gt;

&lt;p&gt;The reset page opened.&lt;/p&gt;

&lt;p&gt;The password was changed.&lt;/p&gt;

&lt;p&gt;The new password worked for login.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 What This Bug Taught Me
&lt;/h2&gt;

&lt;p&gt;The biggest lesson wasn't about Spring Boot, PostgreSQL or email APIs.&lt;/p&gt;

&lt;p&gt;It was about &lt;strong&gt;debugging by layers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of looking at the entire authentication system as one big problem, we broke it down:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend
   ↓
HTTP Request
   ↓
Spring Controller
   ↓
Authentication Service
   ↓
JWT / Token Logic
   ↓
PostgreSQL
   ↓
Email Service
   ↓
Email Provider
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we tested each layer independently.&lt;/p&gt;

&lt;p&gt;A problem that initially felt like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Authentication isn't working."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;became several smaller, solvable problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Duplicate Spring beans&lt;/li&gt;
&lt;li&gt;Database verification&lt;/li&gt;
&lt;li&gt;Migration verification&lt;/li&gt;
&lt;li&gt;Environment variable configuration&lt;/li&gt;
&lt;li&gt;SMTP authentication&lt;/li&gt;
&lt;li&gt;Email provider integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that made the debugging process much less overwhelming.&lt;/p&gt;




&lt;h1&gt;
  
  
  🏁 From Broken to Working
&lt;/h1&gt;

&lt;p&gt;The final authentication flow became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;              Authentication
                     │
        ┌────────────┼────────────┐
        ↓            ↓            ↓
     Signup        Login      Forgot Password
        │            │            │
        ↓            ↓            ↓
   PostgreSQL      JWT       Reset Token
                                  │
                                  ↓
                              Email API
                                  │
                                  ↓
                             Reset Link
                                  │
                                  ↓
                           New Password
                                  │
                                  ↓
                                Login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The best part wasn't that we avoided bugs.&lt;/p&gt;

&lt;p&gt;We didn't.&lt;/p&gt;

&lt;p&gt;The best part was learning how to &lt;strong&gt;trace a failure, isolate the layer causing it, verify assumptions, and change only what actually needed changing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes debugging isn't about finding one bug.&lt;/p&gt;

&lt;p&gt;Sometimes it's about following the trail until the whole system finally makes sense.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>bugsmash</category>
      <category>springboot</category>
      <category>debugging</category>
    </item>
    <item>
      <title>Ever wondered how a computer knows that two sentences mean almost the same thing? 🤔</title>
      <dc:creator>Maha Darshini</dc:creator>
      <pubDate>Mon, 17 Aug 2026 15:00:46 +0000</pubDate>
      <link>https://dev.to/maha_06/ever-wondered-how-a-computer-knows-that-two-sentences-mean-almost-the-same-thing-56m5</link>
      <guid>https://dev.to/maha_06/ever-wondered-how-a-computer-knows-that-two-sentences-mean-almost-the-same-thing-56m5</guid>
      <description>&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%2Fr2svrpy0ll4eb90x2pen.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%2Fr2svrpy0ll4eb90x2pen.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“I'm feeling sleepy.”&lt;br&gt;
“I'm really tired.”&lt;/p&gt;

&lt;p&gt;Different words. Similar meaning.&lt;/p&gt;

&lt;p&gt;That’s where Similarity Search comes in. Text can be converted into embeddings (vectors), and similar meanings are represented closer together in vector space.&lt;/p&gt;

&lt;p&gt;So instead of searching only for the exact same words, we can find results with a similar meaning.&lt;/p&gt;

&lt;p&gt;This is used in search engines, chatbots, recommendation systems, document search, RAG, and much more.&lt;/p&gt;

&lt;p&gt;Day 1 of learning something I’m curious about. 🔍&lt;/p&gt;

</description>
      <category>similaritysearch</category>
      <category>rag</category>
      <category>ai</category>
      <category>vectordatabase</category>
    </item>
    <item>
      <title>Mysore-pak</title>
      <dc:creator>Maha Darshini</dc:creator>
      <pubDate>Thu, 13 Aug 2026 18:04:06 +0000</pubDate>
      <link>https://dev.to/maha_06/mysore-pak-5cfp</link>
      <guid>https://dev.to/maha_06/mysore-pak-5cfp</guid>
      <description>&lt;p&gt;Inspiration&lt;/p&gt;

&lt;p&gt;For this challenge, I chose Mysore Pak, a traditional South Indian sweet and one of my favourite comfort foods.&lt;/p&gt;

&lt;p&gt;I wanted to recreate something that feels familiar and nostalgic using CSS as the main creative medium. The golden colour, ghee-rich texture, soft edges, and layered pieces of Mysore Pak gave me a lot of small details to experiment with.&lt;/p&gt;

&lt;p&gt;Demo&lt;/p&gt;

&lt;p&gt;[&lt;a href="https://splendorous-heliotrope-dc872c.netlify.app/" rel="noopener noreferrer"&gt;https://splendorous-heliotrope-dc872c.netlify.app/&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Journey&lt;/p&gt;

&lt;p&gt;I started by breaking Mysore Pak down into simple visual elements — rectangular sweet pieces, golden gradients, ghee highlights, crumbs, shadows, and a serving plate.&lt;/p&gt;

&lt;p&gt;Instead of using an image, I created the artwork primarily with CSS gradients, pseudo-elements, shadows, transforms, and animations.&lt;/p&gt;

&lt;p&gt;I also added subtle animations to make the artwork feel alive:&lt;/p&gt;

&lt;p&gt;✨ Floating and rotating sparkles&lt;br&gt;
🧈 Ghee highlights and shimmer effects&lt;br&gt;
🍯 Gentle movement of the Mysore Pak pieces&lt;br&gt;
🍽️ Plate light reflection&lt;br&gt;
💫 Small floating crumbs&lt;br&gt;
🌟 Smooth entrance animations&lt;/p&gt;

&lt;p&gt;One of the things I'm most proud of is turning a simple sweet into a detailed CSS illustration without depending on an image asset.&lt;/p&gt;

&lt;p&gt;This challenge also reminded me that frontend development can be a creative medium, not just a way to build interfaces.&lt;/p&gt;

&lt;p&gt;Made with ❤️, CSS, ghee, gram flour, sugar, and a little South Indian nostalgia.&lt;/p&gt;

</description>
      <category>frontendchallenge</category>
      <category>devchallenge</category>
      <category>css</category>
    </item>
    <item>
      <title>Biryani Tales - A Deliciously Illustrated History</title>
      <dc:creator>Maha Darshini</dc:creator>
      <pubDate>Thu, 13 Aug 2026 17:56:25 +0000</pubDate>
      <link>https://dev.to/maha_06/biryani-tales-a-deliciously-illustrated-history-1b2k</link>
      <guid>https://dev.to/maha_06/biryani-tales-a-deliciously-illustrated-history-1b2k</guid>
      <description>&lt;p&gt;What I Built&lt;/p&gt;

&lt;p&gt;Biryani Tales — A Deliciously Illustrated History&lt;/p&gt;

&lt;p&gt;For this challenge, I chose one of my favourite comfort foods: biryani.&lt;/p&gt;

&lt;p&gt;I built an interactive landing page that takes visitors on a visual journey through the history, regional varieties, and cultural stories behind biryani.&lt;/p&gt;

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

&lt;p&gt;🍚 An illustrated hero section featuring a realistic biryani handi&lt;br&gt;
📜 An interactive timeline exploring the history of biryani&lt;br&gt;
🌶️ Regional biryani varieties from across India&lt;br&gt;
🗺️ A "Biryani Flavour Atlas" highlighting regional styles&lt;br&gt;
🃏 Flip cards containing interesting biryani trivia&lt;br&gt;
🎡 An interactive "Spin the Pot" wheel that randomly picks a biryani&lt;br&gt;
✨ Scroll animations and interactive UI elements&lt;br&gt;
📱 Responsive design for different screen sizes&lt;/p&gt;

&lt;p&gt;I wanted the page to feel warm, playful, and food-focused rather than like a traditional informational website.&lt;/p&gt;

&lt;p&gt;Demo&lt;/p&gt;

&lt;p&gt;[&lt;a href="https://delicate-sunburst-b67e2e.netlify.app/" rel="noopener noreferrer"&gt;https://delicate-sunburst-b67e2e.netlify.app/&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Repo Link:&lt;br&gt;
[&lt;a href="https://github.com/Mahadarshini/briyani" rel="noopener noreferrer"&gt;https://github.com/Mahadarshini/briyani&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Journey&lt;/p&gt;

&lt;p&gt;The main idea was to turn something as familiar as biryani into a small interactive storytelling experience.&lt;/p&gt;

&lt;p&gt;I started with the visual direction first — warm cream, saffron, chilli, and masala-inspired colours — and then built the different sections around the story of biryani.&lt;/p&gt;

&lt;p&gt;One of the parts I enjoyed most was creating the biryani handi using CSS, rather than simply using a static image. I experimented with gradients, shadows, layering, rice grains, herbs, meat pieces, metallic textures, steam, and animation to make the pot feel more like a real restaurant-style handi.&lt;/p&gt;

&lt;p&gt;I also wanted the page to have small interactions that make people want to explore, so I added the flip-card trivia section and the interactive biryani wheel.&lt;/p&gt;

&lt;p&gt;What I learned&lt;/p&gt;

&lt;p&gt;This challenge helped me think beyond simply making a page "look good." I focused more on:&lt;/p&gt;

&lt;p&gt;Creating a visual hierarchy&lt;br&gt;
Making interactions feel purposeful&lt;br&gt;
Using CSS to create illustrated elements&lt;br&gt;
Building a consistent visual language&lt;br&gt;
Making a storytelling experience through frontend design&lt;/p&gt;

&lt;p&gt;I'm particularly proud of how the biryani pot evolved from a simple CSS illustration into a more detailed restaurant-style handi.&lt;/p&gt;

&lt;p&gt;What's next?&lt;/p&gt;

&lt;p&gt;I'd like to take this further by adding:&lt;/p&gt;

&lt;p&gt;More regional biryani stories&lt;br&gt;
Real photographs and recipes&lt;br&gt;
Sound effects and subtle food animations&lt;br&gt;
A recipe section&lt;br&gt;
Better mobile interactions&lt;br&gt;
More interactive storytelling elements&lt;/p&gt;

&lt;p&gt;Built with ❤️, CSS, JavaScript, and a lot of biryani cravings.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
