<?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: Saurabh Kumar</title>
    <description>The latest articles on DEV Community by Saurabh Kumar (@asyncmind).</description>
    <link>https://dev.to/asyncmind</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3506840%2F4da34939-cd89-4ca5-869a-c2b58ddb4d2b.jpg</url>
      <title>DEV Community: Saurabh Kumar</title>
      <link>https://dev.to/asyncmind</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/asyncmind"/>
    <language>en</language>
    <item>
      <title>I got tired of try/catch lying to me. So I built result.js.</title>
      <dc:creator>Saurabh Kumar</dc:creator>
      <pubDate>Fri, 12 Jun 2026 05:32:28 +0000</pubDate>
      <link>https://dev.to/asyncmind/i-got-tired-of-trycatch-lying-to-me-so-i-built-resultjs-17ca</link>
      <guid>https://dev.to/asyncmind/i-got-tired-of-trycatch-lying-to-me-so-i-built-resultjs-17ca</guid>
      <description>&lt;p&gt;You call &lt;code&gt;JSON.parse&lt;/code&gt;. It looks safe. Nothing in the signature tells you otherwise.&lt;/p&gt;

&lt;p&gt;Then someone passes garbage in production and your server crashes.&lt;/p&gt;

&lt;p&gt;That's not a bug. That's &lt;code&gt;try/catch&lt;/code&gt; being invisible.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;parseConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Config&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// throws SyntaxError. you'd never know.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function lies. It says it returns a &lt;code&gt;Config&lt;/code&gt;. It doesn't say it might explode. TypeScript doesn't warn you. Your tests probably don't catch it. And the person calling this function has no idea they need to wrap it.&lt;/p&gt;

&lt;p&gt;The failure is real. It's just hidden.&lt;/p&gt;




&lt;h2&gt;
  
  
  What if failure was part of the type?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;parseConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;SyntaxError&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;wrap&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&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;Now the signature is honest. Two possible outcomes. Both visible. TypeScript knows about both. The person calling this function knows about both.&lt;/p&gt;

&lt;p&gt;That's &lt;code&gt;result.js&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The API
&lt;/h2&gt;

&lt;p&gt;Two constructors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;success&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&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="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;failure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;err&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Not found&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Handle both outcomes with &lt;code&gt;match&lt;/code&gt; — both arms required, TypeScript won't compile if you skip one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="nx"&gt;user&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`Welcome, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;err&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`Failed: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;Chain fallible operations without nesting with &lt;code&gt;flatMap&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dashboard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flatMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getPermissions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flatMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;perms&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;buildDashboard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;perms&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unwrapOr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emptyDashboard&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If any step fails, the rest are skipped. The error falls through to &lt;code&gt;unwrapOr&lt;/code&gt;. No &lt;code&gt;if (result.isErr())&lt;/code&gt; checks stacking up.&lt;/p&gt;

&lt;p&gt;Adopt existing throwing code at the boundary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;wrap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;e&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;PARSE_ERROR&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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;h2&gt;
  
  
  Async works too
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;ResultAsync&lt;/code&gt; wraps a &lt;code&gt;Promise&amp;lt;Result&amp;lt;T, E&amp;gt;&amp;gt;&lt;/code&gt; and gives you the same chaining API. Write the whole pipeline, &lt;code&gt;await&lt;/code&gt; once at the end.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ResultAsync&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ApiError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flatMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ResultAsync&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fetchProfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;profileId&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ApiError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;profile&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unwrapOr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anonymous&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No nested awaits. No growing stack of error checks. One &lt;code&gt;await&lt;/code&gt; at the end.&lt;/p&gt;




&lt;h2&gt;
  
  
  When to use it
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;Result&lt;/code&gt; when the failure is an &lt;strong&gt;expected outcome&lt;/strong&gt; — parsing input, querying a database, calling an API.&lt;/p&gt;

&lt;p&gt;Stick with &lt;code&gt;try/catch&lt;/code&gt; when the failure is a &lt;strong&gt;bug&lt;/strong&gt; — out of memory, programmer errors, things that should never happen.&lt;/p&gt;

&lt;p&gt;You don't have to pick one everywhere. &lt;code&gt;wrap&lt;/code&gt; converts throwing code at the boundary so you can work with &lt;code&gt;Result&lt;/code&gt; from there.&lt;/p&gt;




&lt;h2&gt;
  
  
  Install
&lt;/h2&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; @bugfreedev/result.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zero dependencies. Full TypeScript. Ships with type declarations — no &lt;code&gt;@types&lt;/code&gt; package needed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;wrap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ResultAsync&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="s2"&gt;@bugfreedev/result.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Result&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="s2"&gt;@bugfreedev/result.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;The idea is simple: functions that can fail should say so. Not in a comment. Not in the docs. In the type signature, where TypeScript can see it and so can anyone reading the code.&lt;/p&gt;

&lt;p&gt;That's the whole thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/bug-free-dev/result.js" rel="noopener noreferrer"&gt;https://github.com/bug-free-dev/result.js&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/@bugfreedev/result.js" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@bugfreedev/result.js&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try it, I'd love feedback on the API design, naming, and overall developer experience. The goal is to keep it small, obvious, and pleasant to use without turning it into a mini framework.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>npm</category>
      <category>opensource</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Saurabh Kumar</dc:creator>
      <pubDate>Mon, 16 Feb 2026 15:41:09 +0000</pubDate>
      <link>https://dev.to/bug-free-dev/-1i6c</link>
      <guid>https://dev.to/bug-free-dev/-1i6c</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/bug-free-dev" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3506840%2F8ceff964-5ffc-471c-8e71-b38662b420c4.png" alt="bug-free-dev"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/bug-free-dev/something-big-is-coming-to-firechat-53l7" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Something BIG is coming to Firechat 🔥&lt;/h2&gt;
      &lt;h3&gt;Saurabh Kumar ・ Feb 16&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#chatapp&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#nextjs&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#announcement&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>chatapp</category>
      <category>nextjs</category>
      <category>announcement</category>
    </item>
    <item>
      <title>Tell me something a fluent Pythonista doesn’t know 🐍</title>
      <dc:creator>Saurabh Kumar</dc:creator>
      <pubDate>Sun, 14 Dec 2025 05:43:20 +0000</pubDate>
      <link>https://dev.to/asyncmind/tell-me-something-a-fluent-pythonista-doesnt-know-455a</link>
      <guid>https://dev.to/asyncmind/tell-me-something-a-fluent-pythonista-doesnt-know-455a</guid>
      <description>&lt;p&gt;&lt;a href="https://i.giphy.com/media/KAq5w47R9rmTuvWOWa/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/KAq5w47R9rmTuvWOWa/giphy.gif" alt="Python thinking" width="480" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ve been working with Python for quite a while now and feel pretty fluent with it —&lt;br&gt;&lt;br&gt;
but let’s be honest… Python always has &lt;em&gt;something&lt;/em&gt; up its sleeve 😄&lt;/p&gt;

&lt;p&gt;So tell me 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Python feature that surprised you
&lt;/li&gt;
&lt;li&gt;A weird quirk you discovered way too late
&lt;/li&gt;
&lt;li&gt;A clean trick you wish you’d known earlier
&lt;/li&gt;
&lt;li&gt;A “wait… Python can do &lt;em&gt;that&lt;/em&gt;?” moment
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No beginner stuff please 🫡&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fgagro6i73fjmz1sg5umq.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fgagro6i73fjmz1sg5umq.gif" alt="Mind blown" width="200" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m genuinely curious to see what even experienced Pythonistas miss sometimes.&lt;/p&gt;

&lt;p&gt;Drop your underrated Python knowledge below 🔥🐍&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fwi2hz5s55b2q52z4vet4.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fwi2hz5s55b2q52z4vet4.gif" alt="Typing fast" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>learning</category>
      <category>discuss</category>
      <category>developers</category>
    </item>
    <item>
      <title>It’s been a week since I shared my chat app — and I’m trying to understand why it didn’t click</title>
      <dc:creator>Saurabh Kumar</dc:creator>
      <pubDate>Sat, 13 Dec 2025 17:13:57 +0000</pubDate>
      <link>https://dev.to/asyncmind/its-been-a-week-since-i-shared-my-chat-app-and-im-trying-to-understand-why-it-didnt-click-19k0</link>
      <guid>https://dev.to/asyncmind/its-been-a-week-since-i-shared-my-chat-app-and-im-trying-to-understand-why-it-didnt-click-19k0</guid>
      <description>&lt;p&gt;It’s been almost &lt;strong&gt;7 days since I shared Firechat&lt;/strong&gt;, a small chat app I built, and it hasn’t really gone anywhere.&lt;/p&gt;

&lt;p&gt;Not ranting. Not upset. Just genuinely trying to understand &lt;em&gt;why&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I originally built Firechat for my friends so we could chat privately without keeping message history. Over time, it slowly became a proper app, so I decided to share it publicly and see if others found it useful too.&lt;/p&gt;

&lt;p&gt;Maybe the idea isn’t clear.&lt;br&gt;&lt;br&gt;
Maybe the UI isn’t interesting enough.&lt;br&gt;&lt;br&gt;
Maybe people just don’t need another chat app.&lt;br&gt;&lt;br&gt;
Or maybe I’m just bad at presenting it.&lt;/p&gt;

&lt;p&gt;Here’s the app if you want to take a look:&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://fyrechatz.vercel.app" rel="noopener noreferrer"&gt;https://fyrechatz.vercel.app&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;And the source code is here:&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://github.com/bug-free-dev/firechat" rel="noopener noreferrer"&gt;https://github.com/bug-free-dev/firechat&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;If you’ve built side projects before, I’d really appreciate &lt;strong&gt;honest feedback&lt;/strong&gt; — even blunt feedback. “This already exists” or “I wouldn’t use this” is still helpful.&lt;/p&gt;

&lt;p&gt;If you have thoughts, ideas, or suggestions on what could be better (or why this didn’t click at all), I’m all ears.&lt;/p&gt;

&lt;p&gt;Thanks for reading 🙏&lt;br&gt;&lt;br&gt;
Still building. Still learning. 🔥&lt;/p&gt;

</description>
      <category>sideprojects</category>
      <category>webdev</category>
      <category>feedback</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>Tryyyy out Firechat!!</title>
      <dc:creator>Saurabh Kumar</dc:creator>
      <pubDate>Sun, 07 Dec 2025 12:34:40 +0000</pubDate>
      <link>https://dev.to/asyncmind/tryyyy-out-firechat-1dgm</link>
      <guid>https://dev.to/asyncmind/tryyyy-out-firechat-1dgm</guid>
      <description>&lt;h2&gt;
  
  
  &lt;a href="https://fyrechatz.vercel.app" rel="noopener noreferrer"&gt;🔥 Firechat&lt;/a&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Chat. Chill. Vanish. Repeat. 💨✨
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://fyrechatz.vercel.app" rel="noopener noreferrer"&gt;🚀 Try the Live Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Connect with friends, talk freely, and watch your messages disappear like they never existed.  &lt;/p&gt;




&lt;h2&gt;
  
  
  😄 Why Firechat Exists (True Story)
&lt;/h2&gt;

&lt;p&gt;So here’s the lore.&lt;/p&gt;

&lt;p&gt;I just wanted to &lt;strong&gt;chat peacefully with my bro&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But… his sister kept peeping into our chats.&lt;br&gt;&lt;br&gt;
And me being a &lt;strong&gt;highly introverted, slightly isolated kid&lt;/strong&gt;, confrontation was NOT an option 😅&lt;/p&gt;

&lt;p&gt;So instead of arguing, blocking, or crying internally, I did the most reasonable thing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;I built my own chat app.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s how &lt;strong&gt;Firechat&lt;/strong&gt; was born 🔥&lt;br&gt;&lt;br&gt;
A place where messages disappear when the session ends —&lt;br&gt;&lt;br&gt;
no screenshots, no history, no “remember when you said that” trauma.&lt;/p&gt;

&lt;p&gt;Simple problem. Slightly overkill solution. Totally worth it.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌟 What is Firechat?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Firechat&lt;/strong&gt; is a lightweight, real-time chat app made for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;students&lt;/li&gt;
&lt;li&gt;friends&lt;/li&gt;
&lt;li&gt;late-night talks&lt;/li&gt;
&lt;li&gt;secret convos&lt;/li&gt;
&lt;li&gt;and people who just want peace 😌&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Messages &lt;strong&gt;vanish automatically&lt;/strong&gt; when you leave.&lt;br&gt;&lt;br&gt;
No clutter. No noise. Just vibes.&lt;/p&gt;

&lt;p&gt;Built originally &lt;em&gt;just for fun&lt;/em&gt;…&lt;br&gt;&lt;br&gt;
then somehow turned into a full project I kept polishing because I got attached 🫶&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Features (aka cool stuff)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;💬 &lt;strong&gt;Real-time chat&lt;/strong&gt; (talk, not wait)&lt;/li&gt;
&lt;li&gt;🔥 &lt;strong&gt;Ephemeral messages&lt;/strong&gt; – messages disappear when the session ends&lt;/li&gt;
&lt;li&gt;🎨 &lt;strong&gt;Clean &amp;amp; fun UI&lt;/strong&gt; – minimal, smooth, and distraction-free&lt;/li&gt;
&lt;li&gt;🎓 &lt;strong&gt;Made for students&lt;/strong&gt; – by a student, for students&lt;/li&gt;
&lt;li&gt;🙌 &lt;strong&gt;Kudos system&lt;/strong&gt; – appreciate your friends with virtual rewards&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Fast &amp;amp; lightweight&lt;/strong&gt; – no unnecessary drama&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔐 Privacy First. Student Safe.
&lt;/h2&gt;

&lt;p&gt;Firechat is &lt;strong&gt;private by design&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It’s made &lt;strong&gt;for students, by a student&lt;/strong&gt; — so privacy actually matters here.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No permanent chat history&lt;/li&gt;
&lt;li&gt;No awkward “wait… did I delete that?” moments&lt;/li&gt;
&lt;li&gt;No stress if you accidentally forget to clear chats&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Messages &lt;strong&gt;automatically disappear&lt;/strong&gt; when the session ends.&lt;br&gt;&lt;br&gt;
So even if you forget to clear chats… Firechat already did it for you 😌💨&lt;/p&gt;

&lt;p&gt;Basically:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Oops-proof chatting for students.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧠 How it was built (without the boring part)
&lt;/h2&gt;

&lt;p&gt;This project taught me &lt;em&gt;a lot&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I explored ideas, tried things, broke stuff, fixed it again, and slowly shaped Firechat into what it is today.&lt;br&gt;&lt;br&gt;
Some tools helped along the way (you know… the smart kind 😉), but every decision, polish, and late-night tweak was &lt;strong&gt;hands-on learning&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It’s not perfect.&lt;br&gt;&lt;br&gt;
But it’s real.&lt;br&gt;&lt;br&gt;
And it works 🔥&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Want to Help Build It?
&lt;/h2&gt;

&lt;p&gt;Firechat is &lt;strong&gt;open source&lt;/strong&gt;, and help is ALWAYS welcome 🙏&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Source Code:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/bug-free-dev/firechat" rel="noopener noreferrer"&gt;https://github.com/bug-free-dev/firechat&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can help by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🖼️ Adding &lt;strong&gt;media sharing&lt;/strong&gt; (images, GIFs, attachments)&lt;/li&gt;
&lt;li&gt;🎨 Improving UI / animations&lt;/li&gt;
&lt;li&gt;⚡ Making things faster &amp;amp; smoother&lt;/li&gt;
&lt;li&gt;🐛 Fixing bugs or cleaning code&lt;/li&gt;
&lt;li&gt;💡 Suggesting fun ideas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even &lt;strong&gt;small contributions matter a lot&lt;/strong&gt; — PRs, issues, suggestions, anything 💜&lt;/p&gt;

&lt;p&gt;(Also… I’m a bit busy these days, so help = instant good karma 😎&lt;br&gt;&lt;br&gt;
God might notice. No guarantees though.)&lt;/p&gt;




&lt;h2&gt;
  
  
  🔮 Future Ideas (aka “when motivation hits”)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🎨 Custom chat themes&lt;/li&gt;
&lt;li&gt;📸 Image &amp;amp; media sharing&lt;/li&gt;
&lt;li&gt;🔔 Notifications&lt;/li&gt;
&lt;li&gt;🎮 Mini-games inside chat&lt;/li&gt;
&lt;li&gt;✨ Even more playful UI&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💜 Who is this for?
&lt;/h2&gt;

&lt;p&gt;Firechat started as a &lt;strong&gt;student-to-student&lt;/strong&gt; thing.&lt;br&gt;&lt;br&gt;
A safe, simple, and fun space to talk freely.&lt;/p&gt;

&lt;p&gt;Now it’s for &lt;strong&gt;anyone&lt;/strong&gt; who:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;likes clean apps&lt;/li&gt;
&lt;li&gt;enjoys building&lt;/li&gt;
&lt;li&gt;or just wants messages to vanish dramatically 💨&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🌱 A Small Request
&lt;/h2&gt;

&lt;p&gt;If you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tried the app&lt;/li&gt;
&lt;li&gt;liked the idea&lt;/li&gt;
&lt;li&gt;or laughed at the backstory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consider ⭐ starring the repo or contributing something small.&lt;br&gt;&lt;br&gt;
It genuinely helps more than you think.&lt;/p&gt;

&lt;p&gt;And if you don’t — no pressure 😄&lt;br&gt;&lt;br&gt;
Firechat will still vanish your messages either way.&lt;/p&gt;




&lt;p&gt;🔥 Built for students&lt;br&gt;&lt;br&gt;
💬 Built for privacy&lt;br&gt;&lt;br&gt;
💨 Built to disappear  &lt;/p&gt;

&lt;p&gt;Ready to try it?&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://fyrechatz.vercel.app" rel="noopener noreferrer"&gt;Launch the Live Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Made with 💜, curiosity, and way too much caffeine&lt;br&gt;&lt;br&gt;
by a student who just wanted privacy.&lt;/p&gt;

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