<?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: Nguyễn Phú Lương</title>
    <description>The latest articles on DEV Community by Nguyễn Phú Lương (@pluong06).</description>
    <link>https://dev.to/pluong06</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%2F4164437%2F9b7d8600-77d1-4a11-99b2-4fea73e6b1f4.png</url>
      <title>DEV Community: Nguyễn Phú Lương</title>
      <link>https://dev.to/pluong06</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pluong06"/>
    <language>en</language>
    <item>
      <title>Building My First Chrome Extension with Manifest V3: What I Learned as an Indie Dev</title>
      <dc:creator>Nguyễn Phú Lương</dc:creator>
      <pubDate>Mon, 05 Oct 2026 16:46:56 +0000</pubDate>
      <link>https://dev.to/pluong06/building-my-first-chrome-extension-with-manifest-v3-what-i-learned-as-an-indie-dev-gpj</link>
      <guid>https://dev.to/pluong06/building-my-first-chrome-extension-with-manifest-v3-what-i-learned-as-an-indie-dev-gpj</guid>
      <description>&lt;p&gt;Hi everyone! 👋&lt;/p&gt;

&lt;p&gt;I'm Pluong06, a developer based in Vietnam who loves tinkering with modern web tools and building practical productivity utilities.&lt;/p&gt;

&lt;p&gt;A while ago, I decided to step outside the usual sandbox of web apps and build a real-world Chrome Extension using Manifest V3. Like many developers diving into browser extensions for the first time, I quickly realized that building inside a browser tab comes with its own unique set of rules, challenges, and architectural quirks.&lt;/p&gt;

&lt;p&gt;Here are a few honest takeaways and lessons I learned along the way.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Reality of Manifest V3 &amp;amp; Service Workers
If you've read older extension tutorials, they probably talked about persistent background pages. In Manifest V3, that model is gone—replaced by event-driven Service Workers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No persistent memory: The service worker can go dormant after a few seconds of inactivity. You cannot rely on global in-memory variables to keep state.&lt;/p&gt;

&lt;p&gt;Embracing asynchronous storage: Everything from user preferences to session states needs to be reliably synced using chrome.storage.local or chrome.storage.sync.&lt;/p&gt;

&lt;p&gt;Lightweight is king: Keeping your background script decoupled from heavy DOM manipulation is essential for battery life and tab performance.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;UI/UX: Less is Definitely More
When building a browser extension, user attention is your most scarce resource. Nobody opens an extension popup to read a novel or navigate through endless tabs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Frictionless interface: Clean layouts, accessible color contrast, and instant feedback loops make a massive difference.&lt;/p&gt;

&lt;p&gt;Speed: Users expect actions (like formatting content, extracting data, or toggling features) to happen in milliseconds. Client-side processing should be optimized to never block the main UI thread.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Shipping to the Chrome Web Store
The journey doesn't end when the code compiles locally. Preparing an extension for publication taught me a lot about software distribution:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Writing clear, privacy-first privacy policies.&lt;/p&gt;

&lt;p&gt;Declaring strictly necessary permissions in manifest.json to keep user trust high.&lt;/p&gt;

&lt;p&gt;Structuring clean release notes and listening closely to feedback from the first cohort of users.&lt;/p&gt;

&lt;p&gt;What's Next?&lt;br&gt;
Building browser extensions has completely changed how I look at everyday productivity. There is something deeply satisfying about building a lightweight utility that lives right inside your daily workflow and solves real friction.&lt;/p&gt;

&lt;p&gt;I'm continuing to refine my tools, experiment with modern web APIs, and build new projects under the Pluong06 banner.&lt;/p&gt;

&lt;p&gt;🔗 Check out my projects on GitHub: github.com/Pluong06&lt;/p&gt;

&lt;p&gt;🚀 Explore my Chrome Extensions: &lt;a href="https://chromewebstore.google.com/detail/clipboard-manager-%E2%80%93-clipb/ikmeicjclebilkbenhcfljjpclpdaehf?authuser=0&amp;amp;hl=vi" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/clipboard-manager-%E2%80%93-clipb/ikmeicjclebilkbenhcfljjpclpdaehf?authuser=0&amp;amp;hl=vi&lt;/a&gt; &lt;br&gt;
&lt;a href="https://chrome.google.com/webstore/devconsole/7aed4c12-5b9f-48e8-8ba3-a71ea3112c52/hpnjccjokfkjcgcbhklcbibkmbkkdpkj/edit" rel="noopener noreferrer"&gt;https://chrome.google.com/webstore/devconsole/7aed4c12-5b9f-48e8-8ba3-a71ea3112c52/hpnjccjokfkjcgcbhklcbibkmbkkdpkj/edit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're also building extensions or experimenting with Manifest V3, I'd love to connect and exchange thoughts in the comments below!&lt;/p&gt;

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