<?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: Nobin Debnath</title>
    <description>The latest articles on DEV Community by Nobin Debnath (@mognotaapp).</description>
    <link>https://dev.to/mognotaapp</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%2F4002041%2F6e8fe907-5b51-4b7a-9719-b9a6492c5659.jpg</url>
      <title>DEV Community: Nobin Debnath</title>
      <link>https://dev.to/mognotaapp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mognotaapp"/>
    <language>en</language>
    <item>
      <title>I built a real-time multiplayer brain-games platform on nothing but Firebase and vanilla JS</title>
      <dc:creator>Nobin Debnath</dc:creator>
      <pubDate>Tue, 22 Sep 2026 04:37:25 +0000</pubDate>
      <link>https://dev.to/mognotaapp/i-built-a-real-time-multiplayer-brain-games-platform-on-nothing-but-firebase-and-vanilla-js-4k9a</link>
      <guid>https://dev.to/mognotaapp/i-built-a-real-time-multiplayer-brain-games-platform-on-nothing-but-firebase-and-vanilla-js-4k9a</guid>
      <description>&lt;p&gt;I've been building &lt;a href="https://mognota.com" rel="noopener noreferrer"&gt;Mognota&lt;/a&gt; — a free, real-time multiplayer hub of head-to-head brain games (chess variants, word games, mazes) — solo, with no backend game server. Just vanilla JS on the client and Firebase Realtime Database doing all the synchronization. Wanted to share what that architecture actually looks like in practice, because "no server" sounds simpler than it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is
&lt;/h2&gt;

&lt;p&gt;No download, no forced signup — pick a name, click play, you're matched against a live opponent in seconds. About 15 game modes, each leaning on a different skill:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chess variants&lt;/strong&gt; — standard 1v1, plus a 2v2 mode with four kings on one board and voice chat between teammates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LexArena&lt;/strong&gt; — build words from a shared hex letter-hive under a center-letter constraint, race on word count&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anagram Duel&lt;/strong&gt; — unscramble words against a shared clock, skip the hard ones and come back&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge Duel&lt;/strong&gt; — hidden general-knowledge words in a word-search grid, 1v1 race&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maze Race&lt;/strong&gt; — full-visibility and fog-of-war variants, pure spatial speed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The actual hard part: state without a server
&lt;/h2&gt;

&lt;p&gt;With no authoritative game server, every "who won" decision is really "which of two clients wrote to the database last." That sounds like a minor implementation detail until you hit it in practice — I had bugs where a match-timeout timer on one client and a "found the last word" event on the other could both fire near-simultaneously, and a plain &lt;code&gt;update()&lt;/code&gt; call meant whichever write landed last silently overwrote the correct result.&lt;/p&gt;

&lt;p&gt;The fix that actually held up: every path that could plausibly declare a winner goes through a Firebase transaction on that single field, not a blind update. The transaction only commits if the winner field is still unset — so the first legitimate write wins, and every other path becomes a no-op instead of a race.&lt;/p&gt;

&lt;p&gt;Disconnects were the other big one. A player force-quitting the tab or losing wifi mid-match shouldn't strand the other player forever. &lt;code&gt;onDisconnect()&lt;/code&gt; handles the write-on-drop case, but it doesn't distinguish "cleanly closed" from "network died and never told the server" — for things like a live presence counter, that gap meant stale entries could accumulate over time if I didn't also handle staleness with heartbeats/timestamps, not just a single boolean flag.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack, for the curious
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vanilla JS, no framework, no build step — just static HTML/JS served from Firebase Hosting&lt;/li&gt;
&lt;li&gt;Firebase Realtime Database for matchmaking, rooms, presence, friends, and a weekly league/XP system&lt;/li&gt;
&lt;li&gt;Firebase Auth (anonymous guest accounts, upgradeable to Google sign-in without losing progress)&lt;/li&gt;
&lt;li&gt;A couple of Cloudflare Workers for the handful of things that needed a real backend (avatar uploads, abuse reports)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One thing I learned the hard way: keep your database security rules in version control from day one. Mine lived only in the Firebase console for a while, unreviewed and un-diffed, which is a bad place for the one thing standing between your app and anyone with a REST client. Worth fixing before you have real users, not after.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it's at
&lt;/h2&gt;

&lt;p&gt;Solo project, genuinely early. If you try it, I'd love to know: does the real-time-without-a-server thing actually feel responsive, or does the transaction-based conflict resolution ever feel laggy? And if anyone's dealt with the Firebase-rules-in-version-control problem more elegantly than "just remember to export them," I'm all ears.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mognota.com" rel="noopener noreferrer"&gt;https://mognota.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>firebase</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I built a 50+ feature wellness app in a single HTML file as a student — here's why</title>
      <dc:creator>Nobin Debnath</dc:creator>
      <pubDate>Thu, 25 Jun 2026 09:38:37 +0000</pubDate>
      <link>https://dev.to/mognotaapp/i-built-a-50-feature-wellness-app-in-a-single-html-file-as-a-student-heres-why-37mj</link>
      <guid>https://dev.to/mognotaapp/i-built-a-50-feature-wellness-app-in-a-single-html-file-as-a-student-heres-why-37mj</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%2Fuuxjbwdn1a1yk9z2cap5.jpg" 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%2Fuuxjbwdn1a1yk9z2cap5.jpg" alt=" " width="800" height="469"&gt;&lt;/a&gt;Most people lose hours pretending to work or study. I was one of them.&lt;/p&gt;

&lt;p&gt;I kept setting Pomodoro timers and ending up scrolling Twitter during breaks. &lt;br&gt;
That's not rest. That's just a different kind of distraction.&lt;/p&gt;

&lt;p&gt;So I built Mognota — a free wellness companion for screen workers.&lt;/p&gt;

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

&lt;p&gt;You don't have a discipline problem. You have a system problem.&lt;/p&gt;

&lt;p&gt;Your brain has a hard biological limit. Sustained attention peaks at 20-45 &lt;br&gt;
minutes before quality drops sharply. Long unfocused hours are not work — &lt;br&gt;
they are the feeling of work.&lt;/p&gt;

&lt;p&gt;The solution isn't more willpower. It's intentional recovery.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Mognota pairs a Pomodoro timer with 50+ guided wellness activities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;👁️ 20-20-20 eye break reminders&lt;/li&gt;
&lt;li&gt;🫁 Guided breathing &amp;amp; 7 pranayama techniques&lt;/li&gt;
&lt;li&gt;🧘 Desk yoga, HIIT, Tai Chi, stretches&lt;/li&gt;
&lt;li&gt;🎵 Binaural beats &amp;amp; ambient soundscapes&lt;/li&gt;
&lt;li&gt;🧠 Meditation &amp;amp; NSDR protocols&lt;/li&gt;
&lt;li&gt;📓 Gratitude journal, mood tracker, brain dump&lt;/li&gt;
&lt;li&gt;🎮 Sudoku, sliding puzzle, fractal explorer&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Technical Part
&lt;/h2&gt;

&lt;p&gt;This is what dev.to might find interesting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pure HTML, CSS, vanilla JS — zero frameworks&lt;/li&gt;
&lt;li&gt;Everything in a single HTML file&lt;/li&gt;
&lt;li&gt;All 8 notification sounds synthesized with Web Audio API&lt;/li&gt;
&lt;li&gt;localStorage only — nothing leaves your device&lt;/li&gt;
&lt;li&gt;Works offline once loaded&lt;/li&gt;
&lt;li&gt;109+ languages supported&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No npm. No build step. No dependencies. Just open and use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;👉 &lt;a href="https://mognota.com/" rel="noopener noreferrer"&gt;https://mognota.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Completely free. No account. No ads. Forever.&lt;/p&gt;

&lt;p&gt;Would love brutal honest feedback from this community.&lt;/p&gt;

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