<?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: Binay Kumar Das</title>
    <description>The latest articles on DEV Community by Binay Kumar Das (@binaykumardas).</description>
    <link>https://dev.to/binaykumardas</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%2F4083445%2F276ebe01-57f0-4961-bada-74db4003a618.png</url>
      <title>DEV Community: Binay Kumar Das</title>
      <link>https://dev.to/binaykumardas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/binaykumardas"/>
    <language>en</language>
    <item>
      <title>I Thought Email Verification Was Just Sending an OTP. Building It Changed My Mind.</title>
      <dc:creator>Binay Kumar Das</dc:creator>
      <pubDate>Tue, 01 Sep 2026 05:14:00 +0000</pubDate>
      <link>https://dev.to/binaykumardas/i-thought-email-verification-was-just-sending-an-otp-building-it-changed-my-mind-44h4</link>
      <guid>https://dev.to/binaykumardas/i-thought-email-verification-was-just-sending-an-otp-building-it-changed-my-mind-44h4</guid>
      <description>&lt;p&gt;A few weeks ago, I added “Email Verification” to the FindCoffeeMate 2.0 backlog.&lt;br&gt;
The plan in my head was simple.&lt;br&gt;
User signs up.&lt;br&gt;
Send an OTP.&lt;br&gt;
User enters it.&lt;br&gt;
Mark the account as verified.&lt;br&gt;
Move on to the next feature.&lt;br&gt;
As a frontend developer, I’d integrated email verification plenty of times before. The backend always looked straightforward from the outside.&lt;br&gt;
Turns out, there’s a big difference between integrating a feature and designing one.&lt;br&gt;
I got the happy path working in about an hour.&lt;br&gt;
Sign up.&lt;br&gt;
Receive the OTP.&lt;br&gt;
Enter the code.&lt;br&gt;
Account verified.&lt;br&gt;
Everything worked exactly as expected.&lt;br&gt;
I closed my laptop that evening thinking, “Nice. I’ll polish the UI tomorrow and call this feature done.”&lt;br&gt;
Then, while I was lying in bed, one question popped into my head.&lt;br&gt;
“What happens if someone clicks Resend OTP five times?”&lt;br&gt;
Not because they’re trying to break the system.&lt;br&gt;
Just because they’re impatient.&lt;br&gt;
Honestly, I’d probably do the same thing.&lt;br&gt;
Then another question followed.&lt;br&gt;
If five OTPs get generated…&lt;br&gt;
…which one should actually work?&lt;br&gt;
The first one?&lt;br&gt;
The latest one?&lt;br&gt;
All of them?&lt;br&gt;
I realized I hadn’t made that decision at all.&lt;br&gt;
Whatever happened was happening by accident, not by design.&lt;br&gt;
That bothered me more than the bug itself.&lt;br&gt;
So I did what every developer promises themselves they won’t do.&lt;br&gt;
I got out of bed.&lt;br&gt;
Opened my laptop again.&lt;br&gt;
(My family was not impressed.)&lt;br&gt;
Instead of writing code, I opened a notes file and started writing questions.&lt;br&gt;
What happens if someone keeps requesting new OTPs?&lt;br&gt;
Should older codes still be valid?&lt;br&gt;
How long should an OTP live?&lt;br&gt;
What if Gmail delivers an older email after the newer one?&lt;br&gt;
What happens if someone clicks a verification link after they’re already verified?&lt;br&gt;
Is there anything stopping someone from spamming the resend button and burning through my email quota?&lt;br&gt;
At some point I looked at that list and laughed.&lt;br&gt;
My “simple” feature now had more edge cases than implementation.&lt;br&gt;
That’s when something clicked.&lt;br&gt;
I wasn’t building an OTP feature anymore.&lt;br&gt;
I was designing a system.&lt;br&gt;
Once I accepted that, the implementation became much clearer.&lt;br&gt;
The first rule was easy.&lt;br&gt;
Only one OTP should ever be valid.&lt;br&gt;
If a user requests a new one, the previous code becomes useless immediately.&lt;br&gt;
No guessing.&lt;br&gt;
Become a Medium member&lt;br&gt;
No multiple valid codes floating around.&lt;br&gt;
Then I added an expiration time.&lt;br&gt;
I settled on ten minutes.&lt;br&gt;
Not because I found the perfect research paper proving ten minutes is ideal.&lt;br&gt;
I literally opened a few apps, timed how long it took me to get distracted, come back, find the email, and enter the code.&lt;br&gt;
Sometimes engineering is data.&lt;br&gt;
Sometimes it’s just common sense.&lt;br&gt;
The resend button needed attention too.&lt;br&gt;
At first I almost ignored rate limiting.&lt;br&gt;
I remember thinking,&lt;br&gt;
“Who’s going to spam OTP requests on a coffee networking app?”&lt;br&gt;
Then I caught myself.&lt;br&gt;
That’s exactly how technical debt starts.&lt;br&gt;
It’s much easier to add guardrails while the feature is small than after thousands of people start using it.&lt;br&gt;
So resend requests are now rate-limited.&lt;br&gt;
Finally, I handled already-verified accounts.&lt;br&gt;
If someone clicks an old verification email after they’ve already verified their account, the system simply responds that the email is already verified.&lt;br&gt;
No unnecessary database updates.&lt;br&gt;
No confusing errors.&lt;br&gt;
Just a predictable outcome.&lt;br&gt;
None of these decisions were particularly difficult.&lt;br&gt;
Figuring out that they needed to exist was the difficult part.&lt;br&gt;
Working on FindCoffeeMate has changed how I think about software.&lt;br&gt;
When I was mostly working as a frontend developer, my focus was naturally on the user interface.&lt;br&gt;
Does the form validate?&lt;br&gt;
Does the loading state look good?&lt;br&gt;
Does the button work?&lt;br&gt;
Building the backend has forced me to think differently.&lt;br&gt;
As a full stack developer, I’ve started realizing that the experience users have is shaped just as much by API design, database rules, and edge cases as it is by the UI itself.&lt;br&gt;
Somewhere along the way, I also found myself asking questions that I’d normally expect a Product Owner to ask.&lt;br&gt;
“What happens if users do something unexpected?”&lt;br&gt;
“What experience do we actually want them to have?”&lt;br&gt;
“Can we make this impossible to misuse instead of documenting how to use it correctly?”&lt;br&gt;
That’s probably the biggest lesson FindCoffeeMate has taught me so far.&lt;br&gt;
Product Engineering isn’t just about implementing features.&lt;br&gt;
It’s about thinking through all the situations your users should never have to think about.&lt;br&gt;
The funny thing is that nobody using FindCoffeeMate will ever notice any of this.&lt;br&gt;
And honestly, that’s exactly the outcome I want.&lt;br&gt;
If everything works, users will sign up, verify their email in a few seconds, and immediately forget the feature even exists.&lt;br&gt;
They’ll never know about OTP invalidation.&lt;br&gt;
Or expiration times.&lt;br&gt;
Or rate limiting.&lt;br&gt;
Or the evenings I spent asking myself, “Wait… what happens if…”&lt;br&gt;
All of that thinking stays behind the scenes.&lt;br&gt;
That’s what good software should do.&lt;br&gt;
It hides complexity instead of exposing it.&lt;br&gt;
Dark mode is next on my backlog.&lt;br&gt;
I’m telling myself it’ll only take an afternoon.&lt;br&gt;
Let’s see if future me agrees.&lt;br&gt;
P.S. This email verification system will be part of FindCoffeeMate 2.0. Building this product continues to teach me that the hardest part of software engineering usually isn’t writing the code — it’s asking the questions you didn’t know you needed to ask.&lt;/p&gt;

</description>
      <category>backend</category>
      <category>security</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>The Feature Had Zero Bugs. We Removed It Anyway</title>
      <dc:creator>Binay Kumar Das</dc:creator>
      <pubDate>Fri, 21 Aug 2026 04:46:57 +0000</pubDate>
      <link>https://dev.to/binaykumardas/the-feature-had-zero-bugs-we-removed-it-anyway-4hok</link>
      <guid>https://dev.to/binaykumardas/the-feature-had-zero-bugs-we-removed-it-anyway-4hok</guid>
      <description>&lt;p&gt;A few week ago, I am building a feature for my Product FindCoffeeMate.&lt;/p&gt;

&lt;p&gt;It was called “Recently Active Developers.”&lt;/p&gt;

&lt;p&gt;The idea sounded great.&lt;/p&gt;

&lt;p&gt;When users landed on the homepage, they’d immediately see developers who were recently active on the platform. We thought it would encourage more profile visits, connection requests, and conversations.&lt;/p&gt;

&lt;p&gt;From an engineering perspective, everything was done.&lt;/p&gt;

&lt;p&gt;The API worked.&lt;/p&gt;

&lt;p&gt;The UI looked clean.&lt;/p&gt;

&lt;p&gt;The loading states were smooth.&lt;/p&gt;

&lt;p&gt;There were no bugs.&lt;/p&gt;

&lt;p&gt;It was ready to be part of the next release.&lt;/p&gt;

&lt;p&gt;Then we paused.&lt;/p&gt;

&lt;p&gt;Before moving on to the next feature, our team decided to use the app the way a new user would.&lt;/p&gt;

&lt;p&gt;We landed on the homepage, explored a few profiles, searched for developers with specific skills, sent connection requests, and started conversations.&lt;/p&gt;

&lt;p&gt;Only later did we realize something.&lt;/p&gt;

&lt;p&gt;None of us had interacted with the “Recently Active Developers” section.&lt;/p&gt;

&lt;p&gt;Not because it was broken.&lt;/p&gt;

&lt;p&gt;We simply didn’t need it to accomplish what we came to do.&lt;/p&gt;

&lt;p&gt;That small observation led to a much bigger discussion.&lt;/p&gt;

&lt;p&gt;Were we solving a real user problem, or were we just adding another section because it looked like a good idea?&lt;/p&gt;

&lt;p&gt;The more we talked about it, the clearer the answer became.&lt;/p&gt;

&lt;p&gt;The feature worked exactly as intended.&lt;/p&gt;

&lt;p&gt;It just didn’t make the product better.&lt;/p&gt;

&lt;p&gt;So we removed it.&lt;/p&gt;

&lt;p&gt;Deleting working code isn’t easy.&lt;/p&gt;

&lt;p&gt;As engineers, it’s natural to become attached to the things we’ve built. Every feature represents hours of planning, coding, testing, and refining.&lt;/p&gt;

&lt;p&gt;But keeping a feature simply because we’ve already invested time in it isn’t good Product Engineering.&lt;/p&gt;

&lt;p&gt;Every feature has a cost.&lt;/p&gt;

&lt;p&gt;It needs to be tested, maintained, documented, and supported as the product grows.&lt;/p&gt;

&lt;p&gt;If users don’t get value from it, that cost never goes away.&lt;/p&gt;

&lt;p&gt;Working on FindCoffeeMate has changed how I think as both a Frontend Developer and a Full Stack Developer.&lt;/p&gt;

&lt;p&gt;Earlier in my career, I measured success by one question:&lt;/p&gt;

&lt;p&gt;“Does the feature work?”&lt;/p&gt;

&lt;p&gt;Now I ask a different one:&lt;/p&gt;

&lt;p&gt;“Does this feature make the product better?”&lt;/p&gt;

&lt;p&gt;That shift has also given me a deeper appreciation for how a Product Ownerthinks. The best product decisions aren’t always about adding something new. Sometimes they’re about having the confidence to say, “This doesn’t add enough value, let’s keep the product simple.”&lt;/p&gt;

&lt;p&gt;The feature never reached production.&lt;/p&gt;

&lt;p&gt;And honestly, I’m glad it didn’t.&lt;/p&gt;

&lt;p&gt;It reminded me that users don’t care how much effort went into building a feature.&lt;/p&gt;

&lt;p&gt;They care whether it helps them achieve what they came to do.&lt;/p&gt;

&lt;p&gt;Sometimes the best feature you’ll ever build is the one you decide not to ship.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building FindCoffeeMate: A Small MVP That Taught Me Big Lessons</title>
      <dc:creator>Binay Kumar Das</dc:creator>
      <pubDate>Tue, 18 Aug 2026 14:20:43 +0000</pubDate>
      <link>https://dev.to/binaykumardas/building-findcoffeemate-a-small-mvp-that-taught-me-big-lessons-509o</link>
      <guid>https://dev.to/binaykumardas/building-findcoffeemate-a-small-mvp-that-taught-me-big-lessons-509o</guid>
      <description>&lt;p&gt;As developers, we rarely run out of ideas.&lt;/p&gt;

&lt;p&gt;What we often run out of is the right people to build those ideas with.&lt;/p&gt;

&lt;p&gt;Over the years, I noticed a common pattern. Many developers had startup ideas, side projects, or products they wanted to build, but they struggled to find collaborators. Some needed a frontend developer, others needed a backend engineer, designer, or even a co-founder.&lt;/p&gt;

&lt;p&gt;Finding the right people often felt harder than finding the idea itself.&lt;/p&gt;

&lt;p&gt;Why Existing Platforms Didn't Help&lt;/p&gt;

&lt;p&gt;Platforms like LinkedIn are great for networking and job opportunities, but they're not really built for finding people to build side projects with.&lt;/p&gt;

&lt;p&gt;Developer communities are amazing for discussions and learning, but most conversations end there.&lt;/p&gt;

&lt;p&gt;I felt there was a gap between knowing people and building something together.&lt;/p&gt;

&lt;p&gt;That's what inspired me to build a small MVP called FindCoffeeMate.&lt;/p&gt;

&lt;p&gt;Building the MVP&lt;/p&gt;

&lt;p&gt;Instead of trying to build a huge platform, I focused on the basics.&lt;/p&gt;

&lt;p&gt;The first version only included:&lt;/p&gt;

&lt;p&gt;Sending connection requests&lt;/p&gt;

&lt;p&gt;Accepting connections&lt;/p&gt;

&lt;p&gt;Direct messaging&lt;/p&gt;

&lt;p&gt;Sharing startup ideas and collaboration opportunities&lt;/p&gt;

&lt;p&gt;My goal wasn't to build every feature I could think of.&lt;/p&gt;

&lt;p&gt;It was to answer one question:&lt;/p&gt;

&lt;p&gt;Would people actually use a platform designed to help builders find collaborators?&lt;/p&gt;

&lt;p&gt;Technical Challenges&lt;/p&gt;

&lt;p&gt;I built the MVP using React, Express.js, and PostgreSQL.&lt;/p&gt;

&lt;p&gt;A few challenges showed up quickly:&lt;/p&gt;

&lt;p&gt;Managing authentication and user state in React&lt;/p&gt;

&lt;p&gt;Keeping the UI updated when connection requests changed&lt;/p&gt;

&lt;p&gt;Designing APIs for user relationships and messaging&lt;/p&gt;

&lt;p&gt;Creating a database schema that handled users, connections, chats, and collaboration posts cleanly&lt;/p&gt;

&lt;p&gt;One bug that took longer than expected was a connection request issue. The database was updating correctly, but the UI wasn't reflecting the latest state. It turned out to be a frontend state management problem, not a backend issue.&lt;/p&gt;

&lt;p&gt;Moments like these reminded me that debugging is often about questioning your assumptions.&lt;/p&gt;

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

&lt;p&gt;The biggest lesson wasn't technical.&lt;/p&gt;

&lt;p&gt;It was learning that shipping early is more valuable than endlessly adding features.&lt;/p&gt;

&lt;p&gt;Real users provide answers that assumptions never can.&lt;/p&gt;

&lt;p&gt;Instead of spending months perfecting the platform, I released a simple version, started collecting feedback, and learned from how people actually used it.&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;Building FindCoffeeMate reminded me that an MVP doesn't need to be perfect.&lt;/p&gt;

&lt;p&gt;It just needs to solve one problem well enough to learn from real users.&lt;/p&gt;

&lt;p&gt;As developers, it's easy to keep building forever.&lt;/p&gt;

&lt;p&gt;Sometimes the best thing you can do is ship, listen, and improve.&lt;/p&gt;

&lt;p&gt;That's exactly what this MVP taught me.&lt;/p&gt;

&lt;p&gt;findcoffeemate - &lt;a href="https://www.findcoffeemate.com" rel="noopener noreferrer"&gt;https://www.findcoffeemate.com&lt;/a&gt;&lt;br&gt;
Want to know more about me - &lt;a href="https://binaykumardas.github.io" rel="noopener noreferrer"&gt;https://binaykumardas.github.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sideprojects</category>
      <category>startup</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
