<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Nexopad]]></title><description><![CDATA[Nexopad]]></description><link>https://nexopad.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>Nexopad</title><link>https://nexopad.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 15:56:13 GMT</lastBuildDate><atom:link href="https://nexopad.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How I Built a Vanilla JS Chrome Extension to Kill Context Switching (And Got Google's Featured Badge)]]></title><description><![CDATA[As developers and tech professionals, we practically live in our browsers. But a few months ago, I realized something incredibly frustrating about my workflow: context switching was killing my product]]></description><link>https://nexopad.hashnode.dev/how-i-built-a-vanilla-js-chrome-extension-to-kill-context-switching-and-got-google-s-featured-badge</link><guid isPermaLink="true">https://nexopad.hashnode.dev/how-i-built-a-vanilla-js-chrome-extension-to-kill-context-switching-and-got-google-s-featured-badge</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[chrome extension]]></category><category><![CDATA[firefox addon]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[Show Hashnode]]></category><dc:creator><![CDATA[Nexo]]></dc:creator><pubDate>Wed, 22 Apr 2026 13:47:15 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/69e8ceb55d1c1071054f75bb/393e3f29-f140-42aa-a302-ecd88c8a40b7.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As developers and tech professionals, we practically live in our browsers. But a few months ago, I realized something incredibly frustrating about my workflow: <strong>context switching was killing my productivity.</strong></p>
<p>I found myself constantly jumping between 20 different tabs just to find a Markdown note, copy a canned response for a support ticket, or use an AI chat wrapper to rewrite an email. The friction was exhausting.</p>
<p>Instead of complaining about it, I decided to build a solution. That’s how <strong>NexoPad</strong> was born.</p>
<h3>What is NexoPad?</h3>
<p>At its core, <a href="https://nexopad.app/">NexoPad</a> is an all-in-one browser workspace. I wanted to unify the tools I used every day directly into the browser's native layers, bringing the tools to the webpage, not the other way around.</p>
<p>It combines four main pillars:</p>
<ol>
<li><p><strong>Dynamic Text Expander:</strong> Injects templates directly into the active DOM.</p>
</li>
<li><p><strong>Inline AI Assistant:</strong> A Bring-Your-Own-Key (BYOK) model for privacy-first AI.</p>
</li>
<li><p><strong>Local-first Notes:</strong> Markdown editing with a web clipper.</p>
</li>
<li><p><strong>Advanced Tab Manager:</strong> Native Chrome Tab Group integration.</p>
</li>
</ol>
<h3>The Tech Stack: Keeping it Vanilla</h3>
<p>In a world obsessed with heavy JavaScript frameworks, I decided to keep the frontend of this extension as lean as possible. The UI elements (the popup, the persistent side panel, and the injected content scripts) are built primarily with <strong>HTML5 and Vanilla JavaScript</strong>.</p>
<p>For the backend—handling the Free/Pro/Teams tiers, data synchronization, and Role-Based Access Control (RBAC)—I rely on <strong>Supabase</strong>. It provides the perfect balance of a robust PostgreSQL database with real-time capabilities without the headache of managing my own servers.</p>
<h3>The Biggest Technical Challenge: DOM Injection in SPAs</h3>
<p>Building a Chrome extension in the Manifest V3 era is already tricky due to service worker lifecycles, but the real final boss was the <strong>DOM injection</strong>.</p>
<p>I wanted users to type a quick trigger (like <code>/reply</code>) and have NexoPad instantly expand that into a full template inside whatever website they were on. Doing this in a simple <code>&lt;textarea&gt;</code> is easy. But making it work flawlessly across complex Single-Page Applications (SPAs) like Zendesk, Gmail, or modern CRMs—without breaking their internal state (like React's virtual DOM)—was a massive headache.</p>
<p>I ended up building a custom parser that not only injects the text safely but also handles dynamic variables like <code>{{input}}</code> and Spintax on the fly. I even added a visual inspector that allows users to click any DOM element on the page (like a client's name or price) and extract it as a variable for their templates.</p>
<h3>The Privacy First Approach: BYOK AI</h3>
<p>I strongly dislike the current trend of AI wrappers charging $20/mo just to act as a middleman and log your data.</p>
<p>For the AI integration in NexoPad, I implemented a <strong>Bring-Your-Own-Key (BYOK) architecture</strong>. Users plug in their own API keys (OpenAI, Anthropic, Gemini), and the API calls go directly from their local browser to the provider. No middleman servers, no data logging. It allows users to highlight text on any page and trigger an AI prompt via a floating UI that replaces the original text seamlessly.</p>
<h3>The Milestone: Google's Featured Badge</h3>
<p>When I launched the very first iteration of this tool, it got crickets. But I kept iterating, listening to the few users I had, and refining the code.</p>
<p>Last week, that persistence paid off. The Google Chrome Web Store review team manually evaluated the extension and officially awarded it the ⭐ <strong>"Featured" badge</strong>. For an independent developer, getting that level of technical and design validation from Google feels incredible.</p>
<h3>Wrapping Up</h3>
<p>If you are tired of tab overload and want to test a native, privacy-first workspace, you can check out the extension here: <a href="http://nexopad.app"><strong>nexopad.app</strong></a></p>
<p>I’d love to hear from other extension developers! What has been your biggest challenge working with Manifest V3 or DOM injection? Let me know in the comments below.</p>
]]></content:encoded></item></channel></rss>