<?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: Adarsh </title>
    <description>The latest articles on DEV Community by Adarsh  (@adarshm03).</description>
    <link>https://dev.to/adarshm03</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%2F3785000%2F4c17daa7-5bbc-49ae-8af7-f820a8d6181a.jpg</url>
      <title>DEV Community: Adarsh </title>
      <link>https://dev.to/adarshm03</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adarshm03"/>
    <language>en</language>
    <item>
      <title>Engineering a Real-Time Collaborative Editor with Supabase</title>
      <dc:creator>Adarsh </dc:creator>
      <pubDate>Sun, 22 Feb 2026 12:43:37 +0000</pubDate>
      <link>https://dev.to/adarshm03/engineering-a-real-time-collaborative-editor-with-supabase-3ii5</link>
      <guid>https://dev.to/adarshm03/engineering-a-real-time-collaborative-editor-with-supabase-3ii5</guid>
      <description>&lt;p&gt;As a developer who values the "Build → Break → Optimize" philosophy, I wanted to tackle one of the hardest problems in web development: &lt;strong&gt;Real-time Concurrency.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;BitPad&lt;/strong&gt;, a collaborative code editor where developers can create rooms and code together in live-sync. The backbone of this entire system? &lt;strong&gt;Supabase.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Supabase?
&lt;/h2&gt;

&lt;p&gt;Instead of managing a complex WebSocket server manually, I leveraged Supabase's &lt;strong&gt;Realtime engine&lt;/strong&gt;. This allowed me to focus on the user experience while the infrastructure handled the heavy lifting of syncing state across multiple clients.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Technical Stack:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Database &amp;amp; Realtime&lt;/strong&gt;: Supabase (Postgres) for instant data broadcasting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Next.js and Tailwind CSS for a lean, high-performance UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture&lt;/strong&gt;: A room-based system where every keystroke is synchronized across all connected peers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Challenge: Managing State at Scale
&lt;/h2&gt;

&lt;p&gt;The hardest part of building BitPad was ensuring that the "Room" state didn't become a bottleneck. By using Supabase's row-level security and realtime listeners, I was able to create a secure, fast, and scalable environment where developers can jump in and out of sessions without losing a single line of code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Learnings
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure over Boilerplate&lt;/strong&gt;: Supabase allowed me to ship a "Live Share" competitor in record time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concurrency Patterns&lt;/strong&gt;: Handling simultaneous edits taught me a massive amount about database locks and race conditions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Check out the live build:&lt;/strong&gt; &lt;a href="https://bitpad.vercel.app/" rel="noopener noreferrer"&gt;bitpad.vercel.app&lt;/a&gt;&lt;/p&gt;

</description>
      <category>supabase</category>
      <category>nextjs</category>
      <category>webdev</category>
      <category>realtime</category>
    </item>
    <item>
      <title>Why I Built DSA Portal 2026: Solving the Roadmap Problem</title>
      <dc:creator>Adarsh </dc:creator>
      <pubDate>Sun, 22 Feb 2026 12:40:39 +0000</pubDate>
      <link>https://dev.to/adarshm03/why-i-built-dsa-portal-2026-solving-the-roadmap-problem-fgk</link>
      <guid>https://dev.to/adarshm03/why-i-built-dsa-portal-2026-solving-the-roadmap-problem-fgk</guid>
      <description>&lt;p&gt;Data Structures and Algorithms (DSA) are the foundation of computer science, but for most students, the biggest hurdle isn't the logic—it's the &lt;strong&gt;resource overload&lt;/strong&gt;. Between YouTube, LeetCode, and textbooks, it's easy to get lost.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;DSA Portal 2026&lt;/strong&gt; to act as a centralized "source of truth." My goal was to move away from chaotic bookmarking and toward a structured, high-performance learning hub.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture of Learning
&lt;/h2&gt;

&lt;p&gt;When building this portal, I didn't just want a list of links. I wanted a platform that felt like an extension of the developer workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Structured Taxonomy&lt;/strong&gt;: Organizing topics by complexity (Arrays → Trees → Graphs) ensures a logical progression.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimalist UX&lt;/strong&gt;: Built with Next.js and Vercel to ensure zero latency. When a student is in "deep work" mode, the UI should disappear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Curated Signal, No Noise&lt;/strong&gt;: Every resource in the portal is hand-picked to ensure it provides the highest ROI for learning time.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework&lt;/strong&gt;: Next.js (for optimized routing)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling&lt;/strong&gt;: Tailwind CSS (maintaining a clean, "Sandip-style" minimalist aesthetic)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt;: Vercel (CD/CI for instant updates)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Philosophy: Build to Learn
&lt;/h2&gt;

&lt;p&gt;My philosophy is &lt;strong&gt;Build → Break → Optimize&lt;/strong&gt;. By building this portal, I had to deeply understand the relationships between different DSA topics to categorize them correctly. It wasn’t just a web project; it was a knowledge-mapping exercise.&lt;/p&gt;

&lt;p&gt;Whether you're preparing for interviews or just want to strengthen your fundamentals, having a structured roadmap is the fastest way to progress.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explore the portal here:&lt;/strong&gt; &lt;a href="https://dsa-portal-2026-ad.vercel.app/" rel="noopener noreferrer"&gt;dsa-portal-2026-ad.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What is your preferred way to track your DSA progress? Let’s discuss in the comments.&lt;/p&gt;

</description>
      <category>dsa</category>
      <category>webdev</category>
      <category>learning</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How I Engineered a Custom Chromium Adblocker from Scratch (Manifest V3)</title>
      <dc:creator>Adarsh </dc:creator>
      <pubDate>Sun, 22 Feb 2026 12:26:43 +0000</pubDate>
      <link>https://dev.to/adarshm03/how-i-engineered-a-custom-chromium-adblocker-from-scratch-manifest-v3-1og0</link>
      <guid>https://dev.to/adarshm03/how-i-engineered-a-custom-chromium-adblocker-from-scratch-manifest-v3-1og0</guid>
      <description>&lt;p&gt;As a Linux-first developer, my entire workflow is built around granular control. I rely on Neovim and the terminal to keep my environment lean and completely free of bloatware. Recently, I decided to apply that exact same philosophy to my web browser.&lt;/p&gt;

&lt;p&gt;Instead of just downloading a black-box extension to block ads, I wanted to understand the mechanics underneath. My engineering philosophy is simple: &lt;strong&gt;Build → Break → Optimize&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;So, I built and shipped v1.0 of my own Chromium-based adblocker. Here is exactly how it works under the hood using Manifest V3.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Engine: &lt;code&gt;manifest.json&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Every Chromium extension starts with the manifest. With the controversial shift to Manifest V3 (MV3), Google changed how adblockers operate, moving away from the old &lt;code&gt;webRequest&lt;/code&gt; API to the newer &lt;code&gt;declarativeNetRequest&lt;/code&gt; API. &lt;/p&gt;

&lt;p&gt;This means the browser handles the blocking natively based on rules we provide, making it faster and more secure. Here is the core of the engine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"manifest_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ZeroBloat Adblocker"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A lightweight, custom adblocker built for speed."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"declarativeNetRequest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"declarativeNetRequestFeedback"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"host_permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;all_urls&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"declarative_net_request"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rule_resources"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ruleset_1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rules.json"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;rules.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"priority"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"block"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"urlFilter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"||doubleclick.net^"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"resourceTypes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"script"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"xmlhttprequest"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"priority"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"block"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"urlFilter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"||googleadservices.com^"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"resourceTypes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"script"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Breaking Down the Mechanics:
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;id&lt;/code&gt;: Every rule needs a unique integer.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;action: { "type": "block" }&lt;/code&gt;: This tells the browser to instantly drop the connection before it even resolves.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;urlFilter&lt;/code&gt;: This uses standard Adblock Plus syntax. The &lt;code&gt;||&lt;/code&gt;means it matches the domain and all subdomains, catching the trackers before they load.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Optimize" Phase
&lt;/h2&gt;

&lt;p&gt;Building v1.0 was about getting the core mechanics working. It successfully strips out the heavy tracking scripts and media elements from standard pages, resulting in a much cleaner, faster browsing experience.&lt;/p&gt;

&lt;p&gt;The next phase is optimizing the rule sets and exploring how to handle dynamic element hiding without introducing the very bloatware I set out to avoid.&lt;/p&gt;

&lt;p&gt;If you are a student or developer who usually relies on out-of-the-box tools, I highly recommend building your own. You learn vastly more about browser architecture by breaking and building the tools you use every single day.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>chromeextension</category>
    </item>
  </channel>
</rss>
