{"id":4153,"date":"2026-10-20T14:07:49","date_gmt":"2026-10-20T14:07:49","guid":{"rendered":"https:\/\/nownodes.io\/blog\/?p=4153"},"modified":"2026-10-20T14:07:50","modified_gmt":"2026-10-20T14:07:50","slug":"how-to-build-a-web3-chrome-extension","status":"publish","type":"post","link":"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/","title":{"rendered":"How to Build a Web3 Chrome Extension"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A Web3 Chrome extension is a normal browser extension \u2014 built with HTML, CSS, and JavaScript \u2014 that talks to a blockchain instead of (or alongside) a regular web server. It lives in the toolbar, opens in a small popup, and can read on-chain data or send transactions through a wallet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide walks through building one from scratch: a small extension that looks up the ETH balance of any address. From there, you&#8217;ll add wallet support, keep your node credentials safe, and ship it to the Chrome Web Store. The examples use Manifest V3, which is now the only version Chrome accepts.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"what-is-a-web3-browser-extension\">What Is a Web3 Browser Extension?<\/h2>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"2006\" height=\"784\" src=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-113.png\" alt=\"\" class=\"wp-image-4154\" srcset=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-113.png 2006w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-113-300x117.png 300w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-113-768x300.png 768w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-113-1024x400.png 1024w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-113-1536x600.png 1536w\" sizes=\"auto, (max-width: 2006px) 100vw, 2006px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s a browser add-on that connects to a blockchain network. The front end is identical to any Chrome extension \u2014 standard web files packaged into a small app. What makes it &#8220;Web3&#8221; is where it gets its data: a blockchain node, usually reached over an RPC (Remote Procedure Call) endpoint, which is a server that reads chain state and broadcasts signed transactions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You already use several of these. MetaMask is a non-custodial wallet extension. Gas trackers show live fee estimates. Portfolio extensions read balances across chains. All of them follow the same pattern: a popup UI plus a connection to the network.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The extension itself doesn&#8217;t run a blockchain node. It sends JSON-RPC requests \u2014 for example <code>eth_getBalance<\/code> to read a balance \u2014 and renders whatever comes back.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"why-build-one-instead-of-a-web-app\">Why Build One Instead of a Web App?<\/h2>\n\n\n<p class=\"wp-block-paragraph\">A browser extension solves a few problems a plain website can&#8217;t. It&#8217;s always one click away in the toolbar, with no tab to open and no URL to type. It can read and modify the pages a user visits, which is how wallets inject a connection into dApps. And it keeps a persistent presence, so a price tracker or transaction monitor can sit in the corner of the screen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That reach is also why wallets are extensions rather than sites. A dApp in a browser tab needs to talk to a wallet that holds the user&#8217;s keys. The wallet extension exposes an interface the page can call, and the user approves each action in a popup they trust.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Typical builders include wallet teams, analytics and portfolio tools, gas and fee estimators, NFT viewers, and internal dashboards that need a quick on-chain lookup without a full web front end.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"what-you-need-before-you-start\">What You Need Before You Start<\/h2>\n\n\n<p class=\"wp-block-paragraph\">You don&#8217;t need much to build a basic Web3 Chrome extension.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>What you need<\/th><th>Why it matters<\/th><\/tr><\/thead><tbody><tr><td>Google Chrome (or a Chromium browser like Brave or Edge)<\/td><td>To load and test the unpacked extension<\/td><\/tr><tr><td>A code editor such as VS Code<\/td><td>To write the manifest and scripts<\/td><\/tr><tr><td>An RPC endpoint for Ethereum<\/td><td>So the extension can read chain data without you running a node<\/td><\/tr><tr><td>Basic HTML, CSS, and JavaScript<\/td><td>The extension&#8217;s entire front end is web code<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The one piece that often trips people up is the node connection. Running your own Ethereum node means syncing and maintaining hundreds of gigabytes of state, which is overkill for a toolbar app. Instead, you point the extension at a hosted <a href=\"https:\/\/nownodes.io\">RPC endpoint<\/a>. Our shared nodes expose standard JSON-RPC methods such as <code>eth_getBalance<\/code>, so the request in this tutorial works the same whether you&#8217;re on a free public endpoint or a keyed plan.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a quick local demo you can start with a free public endpoint \u2014 no registration, no API key \u2014 and move to a plan with a higher <a href=\"https:\/\/nownodes.io\/pricing\">request quota<\/a> once the extension does real work.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"how-to-build-one-step-by-step\">How to Build One Step by Step<\/h2>\n\n\n<p class=\"wp-block-paragraph\">We&#8217;ll build an extension with three files: a manifest, a popup page, and a script. No bundler required. Larger projects often add webpack or a build tool, but a simple extension doesn&#8217;t need one.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"set-up-the-project-files\">Set Up the Project Files<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Create a folder and add three empty files:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">sh<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir eth-balance-extension\ncd eth-balance-extension\ntouch manifest.json popup.html popup.js<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s the whole project. Chrome loads the folder directly.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"write-the-manifest-file\">Write the Manifest File<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Every extension needs a <code>manifest.json<\/code>. It tells Chrome the extension&#8217;s name, version, what the toolbar button does, and which hosts the extension may contact.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">json<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"manifest_version\": 3,\n  \"name\": \"ETH Balance Viewer\",\n  \"version\": \"1.0\",\n  \"description\": \"Check any Ethereum address balance from your browser.\",\n  \"action\": {\n    \"default_popup\": \"popup.html\"\n  },\n  \"host_permissions\": &#91;\n    \"https:\/\/your-rpc-host.example\/*\"\n  ]\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A few things matter here. <code>manifest_version<\/code> must be <code>3<\/code> \u2014 more on that below. The <code>action<\/code> block points the toolbar button at the popup. <code>host_permissions<\/code> lists the RPC host the extension is allowed to call, so the cross-origin request isn&#8217;t blocked. Replace the placeholder host with the endpoint you&#8217;re using.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"build-the-popup-interface\">Build the Popup Interface<\/h3>\n\n\n<p class=\"wp-block-paragraph\">The popup is a plain HTML page. One input for an address, one button, and a spot to show the result.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">html<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\"&gt;\n  &lt;head&gt;\n    &lt;meta charset=\"UTF-8\" \/&gt;\n    &lt;style&gt;\n      body { font-family: system-ui, sans-serif; width: 280px; padding: 16px; }\n      input, button { width: 100%; padding: 8px; margin-top: 8px; box-sizing: border-box; }\n      #result { margin-top: 12px; font-weight: 600; }\n    &lt;\/style&gt;\n  &lt;\/head&gt;\n  &lt;body&gt;\n    &lt;input id=\"address\" type=\"text\" placeholder=\"Ethereum address (0x...)\" \/&gt;\n    &lt;button id=\"check\"&gt;Check balance&lt;\/button&gt;\n    &lt;div id=\"result\"&gt;&lt;\/div&gt;\n    &lt;script src=\"popup.js\"&gt;&lt;\/script&gt;\n  &lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Notice the script is loaded from a separate file rather than written inline. Manifest V3 blocks inline JavaScript for security, so all your logic has to live in <code>.js<\/code> files.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"connect-to-ethereum-through-an-rpc-endpoint\">Connect to Ethereum Through an RPC Endpoint<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Now the logic. When the button is clicked, the script sends an <code>eth_getBalance<\/code> request and converts the result from Wei (the smallest ETH unit) to ether.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">javascript<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const RPC_URL = \"YOUR_ETH_RPC_ENDPOINT\"; \/\/ from your node dashboard\n\ndocument.getElementById(\"check\").addEventListener(\"click\", async () =&gt; {\n  const address = document.getElementById(\"address\").value.trim();\n  const out = document.getElementById(\"result\");\n  if (!address) { out.textContent = \"Enter an address first.\"; return; }\n\n  try {\n    const res = await fetch(RPC_URL, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({\n        jsonrpc: \"2.0\",\n        id: 1,\n        method: \"eth_getBalance\",\n        params: &#91;address, \"latest\"]\n      })\n    });\n    const data = await res.json();\n    const eth = parseInt(data.result, 16) \/ 1e18;\n    out.textContent = `Balance: ${eth.toFixed(4)} ETH`;\n  } catch (e) {\n    out.textContent = \"Request failed. Check the endpoint and address.\";\n  }\n});<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>eth_getBalance<\/code> returns a hex string, which is why the code parses it as base-16 and divides by <code>1e18<\/code>. Swap <code>YOUR_ETH_RPC_ENDPOINT<\/code> for the endpoint URL from your node dashboard. Keep the <code>host_permissions<\/code> entry in the manifest in sync with this host.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"load-and-test-it-in-chrome\">Load and Test It in Chrome<\/h3>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"535\" src=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-114-1024x535.png\" alt=\"\" class=\"wp-image-4155\" srcset=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-114-1024x535.png 1024w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-114-300x157.png 300w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-114-768x401.png 768w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-114-1536x802.png 1536w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-114.png 1735w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Local testing is free \u2014 you don&#8217;t publish anything to try the extension.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open <code>chrome:\/\/extensions<\/code> in a new tab.<\/li>\n\n\n\n<li>Turn on <strong>Developer mode<\/strong> (top-right toggle).<\/li>\n\n\n\n<li>Click <strong>Load unpacked<\/strong> and select your project folder.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">The extension appears in the list and in the toolbar. Click it, paste an address, and check the balance. A good test address is Ethereum co-founder Vitalik Buterin&#8217;s public wallet, <code>0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045<\/code>. Edit a file, click the refresh icon on the extension card, and your changes reload.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"how-to-connect-a-wallet-like-metamask\">How to Connect a Wallet Like MetaMask<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Reading a balance only needs an RPC endpoint. Sending a transaction needs a wallet, because the wallet holds the user&#8217;s keys and signs on their behalf. Your extension never touches the private key \u2014 it asks the wallet to sign.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"injected-providers-and-windowethereum\">Injected Providers and window.ethereum<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Wallet extensions inject a provider object into web pages following <a href=\"https:\/\/docs.metamask.io\/wallet\/concepts\/wallet-interoperabilty\/\" rel=\"nofollow noopener noreferrer\">EIP-1193<\/a>, the standard Ethereum provider interface. Historically, dApps reached it through the global <code>window.ethereum<\/code>. You request access, then read the connected account:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">javascript<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>await window.ethereum.request({ method: \"eth_requestAccounts\" });<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The catch is that <code>window.ethereum<\/code> was never designed for more than one wallet. When a user has several wallet extensions installed, they all compete to inject into the same object, and the last one to load usually wins \u2014 so the dApp can&#8217;t reliably reach the wallet the user actually wants.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"discovering-wallets-with-eip6963\">Discovering Wallets With EIP-6963<\/h3>\n\n\n<p class=\"wp-block-paragraph\">The fix is <a href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-6963\" rel=\"nofollow noopener noreferrer\">EIP-6963<\/a>, the Multi Injected Provider Discovery standard. Instead of fighting over one global, each wallet announces itself through a browser event, and your code collects every wallet the user has. MetaMask&#8217;s own documentation recommends this mechanism for discovery, and it&#8217;s supported by MetaMask, Coinbase Wallet, Trust Wallet, OKX, and other major wallets.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">javascript<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const wallets = &#91;];\nwindow.addEventListener(\"eip6963:announceProvider\", (event) =&gt; {\n  wallets.push(event.detail); \/\/ { info, provider }\n});\nwindow.dispatchEvent(new Event(\"eip6963:requestProvider\"));<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Each <code>event.detail<\/code> carries <code>info<\/code> (the wallet&#8217;s name, icon, and a reverse-domain ID like <code>io.metamask<\/code>) and a <code>provider<\/code> you can call. You present the list, let the user pick, and connect to their choice. For dApps that haven&#8217;t added EIP-6963 yet, <code>window.ethereum<\/code> still works as a fallback.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once you have a provider, a library makes signing easier. With <a href=\"https:\/\/docs.ethers.org\/v6\/\" rel=\"nofollow noopener noreferrer\">ethers.js v6<\/a> \u2014 the current major release \u2014 you wrap the provider and get a signer:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">javascript<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const provider = new ethers.BrowserProvider(window.ethereum);\nconst signer = await provider.getSigner();\nconst address = await signer.getAddress();<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If you used ethers v5 before, note that v6 renamed <code>Web3Provider<\/code> to <code>BrowserProvider<\/code> and made <code>getSigner()<\/code> asynchronous. web3.js and viem are equally valid choices; ethers is just one common option.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"keeping-your-rpc-key-off-the-client\">Keeping Your RPC Key Off the Client<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Anyone can unzip a published Chrome extension and read its code. If you hard-code a secret API key in <code>popup.js<\/code>, you&#8217;ve handed it to the world. That key can then be used \u2014 and abused \u2014 against your node account.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Two patterns keep you safe. For public, read-only data, a free public endpoint with no key is fine to ship. For anything that needs a private key, put a small backend in front of your node: the extension calls your server, and your server adds the key and forwards the request to the RPC provider. The credential stays on the server and never reaches the browser.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A few more security basics apply to any crypto extension:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Request only the permissions you actually use. Narrow <code>host_permissions<\/code> reduce the attack surface.<\/li>\n\n\n\n<li>Never ask a user for their seed phrase or private key. No legitimate extension needs it.<\/li>\n\n\n\n<li>Manifest V3 bans remotely hosted code, so all your JavaScript ships inside the package and is reviewed. Don&#8217;t try to load executable code from a URL at runtime \u2014 it won&#8217;t pass review.<\/li>\n<\/ul>\n\n\n<h2 class=\"wp-block-heading\" id=\"how-to-publish-it-to-the-chrome-web-store\">How to Publish It to the Chrome Web Store<\/h2>\n\n\n<p class=\"wp-block-paragraph\">When the extension is ready for other people, you publish it through the Chrome Web Store.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Register a developer account and pay the one-time <strong>$5 registration fee<\/strong>. Chrome now requires this before you can use the developer dashboard.<\/li>\n\n\n\n<li>Zip the contents of your project folder \u2014 the files themselves, not the enclosing folder.<\/li>\n\n\n\n<li>Upload the ZIP in the dashboard, then fill in the listing: name, description, icons, screenshots, and a privacy disclosure.<\/li>\n\n\n\n<li>Submit for review. Extensions that handle crypto or wallets often draw extra scrutiny, so expect a careful look and keep your permissions justified.<\/li>\n\n\n\n<li>After approval it goes live. Each future update also passes through review.<\/li>\n<\/ol>\n\n\n<h2 class=\"wp-block-heading\" id=\"limitations-and-risks-to-plan-for\">Limitations and Risks to Plan For<\/h2>\n\n\n<p class=\"wp-block-paragraph\">A Web3 Chrome extension is powerful, but a few constraints shape how you build it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Manifest V2 era is over. Google disabled Manifest V2 extensions across Chrome with version 138 in July 2025, and on August 31, 2026 it removed the last of them from the Chrome Web Store. New extensions must be Manifest V3, full stop.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Under Manifest V3, the background script is a service worker that sleeps when idle instead of running continuously. Don&#8217;t rely on long-lived background state; save anything important to storage and reload it when the worker wakes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The biggest risks are on the trust side. Secret keys in client code leak the moment the extension is published. Crypto extensions are prime phishing targets, so impersonation and fake listings are a real concern for your users. Treat security and permission scope as first-class features, not afterthoughts.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusion<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Building a Web3 Chrome extension comes down to three layers: a standard extension shell, a reliable connection to the chain, and \u2014 when you need transactions \u2014 a wallet the user controls. The balance-viewer example covers the first two; EIP-6963 and a signing library add the third.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The piece that quietly carries the rest is the node connection. A toolbar app shouldn&#8217;t be running its own Ethereum node, and it shouldn&#8217;t be leaking keys to do RPC calls either. That&#8217;s where our infrastructure fits: NOWNodes gives you RPC access across 120+ networks, so you can start on a free public endpoint, move to a keyed plan behind a proxy for production, and point the same extension at Bitcoin, Polygon, BNB Smart Chain, or any other supported chain without rebuilding it. If you want a deeper look at wiring a chain into an app, see our guide on <a href=\"https:\/\/nownodes.io\/blog\/how-to-integrate-ethereum-web3-project\/\">integrating Ethereum into a Web3 project<\/a>.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n<h3 class=\"wp-block-heading\" id=\"what-programming-languages-do-i-need\">What Programming Languages Do I Need?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">HTML, CSS, and JavaScript cover everything in a Chrome extension. TypeScript is optional and popular for larger projects, but it&#8217;s not required to ship.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"can-the-extension-support-blockchains-other-than-ethereum\">Can the Extension Support Blockchains Other Than Ethereum?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Yes. Any network with an RPC endpoint works the same way \u2014 you change the endpoint URL and the methods you call. A single extension can talk to several chains if you give it an endpoint for each.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"do-i-have-to-use-ethersjs-or-can-i-use-web3js-or-viem\">Do I Have to Use ethers.js, or Can I Use web3.js or viem?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Any of them works, and you can also use plain <code>fetch<\/code> for simple read calls, as the balance example does. ethers.js v6, web3.js, and viem all handle wallet connections and signing; pick the one your team prefers.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"will-a-chrome-extension-run-in-brave-edge-or-firefox\">Will a Chrome Extension Run in Brave, Edge, or Firefox?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Chromium-based browsers like Brave and Edge load the same Manifest V3 package with little or no change. Firefox uses a different extension model, so a port usually needs some adaptation before it runs there.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A Web3 Chrome extension is a normal browser extension \u2014 built with HTML, CSS, and JavaScript \u2014 that talks to a blockchain instead of (or alongside) a regular web server. It lives in the toolbar, opens in a small popup, and can read on-chain data or send transactions through a wallet. This guide walks through [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":4156,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_eb_attr":"","_lmt_disableupdate":"","_lmt_disable":"","_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[102],"tags":[],"class_list":["post-4153","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev-report"],"blocksy_meta":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Web3 Chrome Extension: Step-by-Step Build Guide<\/title>\n<meta name=\"description\" content=\"Build a Web3 Chrome extension on Manifest V3: set up the project, read Ethereum data over RPC, connect a wallet with EIP-6963, and publish to the store.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Web3 Chrome Extension: Step-by-Step Build Guide\" \/>\n<meta property=\"og:description\" content=\"Build a Web3 Chrome extension on Manifest V3: set up the project, read Ethereum data over RPC, connect a wallet with EIP-6963, and publish to the store.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/\" \/>\n<meta property=\"og:site_name\" content=\"NOWNodes Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-20T14:07:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-20T14:07:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/text_1-30.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1200\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"\u0410nastasia\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nownodes\" \/>\n<meta name=\"twitter:site\" content=\"@nownodes\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u0410nastasia\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/\"},\"author\":{\"name\":\"\u0410nastasia\",\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/person\/0890ec68e813adecb93c18ee00e1e7a8\"},\"headline\":\"How to Build a Web3 Chrome Extension\",\"datePublished\":\"2026-10-20T14:07:49+00:00\",\"dateModified\":\"2026-10-20T14:07:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/\"},\"wordCount\":2007,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/nownodes.io\/blog\/#organization\"},\"articleSection\":[\"Dev Report\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/\",\"url\":\"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/\",\"name\":\"Web3 Chrome Extension: Step-by-Step Build Guide\",\"isPartOf\":{\"@id\":\"https:\/\/nownodes.io\/blog\/#website\"},\"datePublished\":\"2026-10-20T14:07:49+00:00\",\"dateModified\":\"2026-10-20T14:07:50+00:00\",\"description\":\"Build a Web3 Chrome extension on Manifest V3: set up the project, read Ethereum data over RPC, connect a wallet with EIP-6963, and publish to the store.\",\"breadcrumb\":{\"@id\":\"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Blog\",\"item\":\"https:\/\/nownodes.io\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dev Report\",\"item\":\"https:\/\/nownodes.io\/blog\/category\/dev-report\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"How to Build a Web3 Chrome Extension\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/nownodes.io\/blog\/#website\",\"url\":\"https:\/\/nownodes.io\/blog\/\",\"name\":\"NOWNodes Blog\",\"description\":\"Your first-to-go source of development guides, web3 analytics and most recent news about NOWNodes\",\"publisher\":{\"@id\":\"https:\/\/nownodes.io\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/nownodes.io\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/nownodes.io\/blog\/#organization\",\"name\":\"NOWNodes Blog\",\"url\":\"https:\/\/nownodes.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2024\/02\/cropped-New-Logo-NN.png\",\"contentUrl\":\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2024\/02\/cropped-New-Logo-NN.png\",\"width\":1164,\"height\":1164,\"caption\":\"NOWNodes Blog\"},\"image\":{\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/twitter.com\/nownodes\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/person\/0890ec68e813adecb93c18ee00e1e7a8\",\"name\":\"\u0410nastasia\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1de24ab8dcdd7ec30f6adaf78b56bc1eda421f87575b7e103c8fc3fc4420e833?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1de24ab8dcdd7ec30f6adaf78b56bc1eda421f87575b7e103c8fc3fc4420e833?s=96&d=mm&r=g\",\"caption\":\"\u0410nastasia\"},\"url\":\"https:\/\/nownodes.io\/blog\/author\/nasty-nownodes\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Web3 Chrome Extension: Step-by-Step Build Guide","description":"Build a Web3 Chrome extension on Manifest V3: set up the project, read Ethereum data over RPC, connect a wallet with EIP-6963, and publish to the store.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/","og_locale":"en_US","og_type":"article","og_title":"Web3 Chrome Extension: Step-by-Step Build Guide","og_description":"Build a Web3 Chrome extension on Manifest V3: set up the project, read Ethereum data over RPC, connect a wallet with EIP-6963, and publish to the store.","og_url":"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/","og_site_name":"NOWNodes Blog","article_published_time":"2026-10-20T14:07:49+00:00","article_modified_time":"2026-10-20T14:07:50+00:00","og_image":[{"width":2400,"height":1200,"url":"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/text_1-30.jpg","type":"image\/jpeg"}],"author":"\u0410nastasia","twitter_card":"summary_large_image","twitter_creator":"@nownodes","twitter_site":"@nownodes","twitter_misc":{"Written by":"\u0410nastasia","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/#article","isPartOf":{"@id":"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/"},"author":{"name":"\u0410nastasia","@id":"https:\/\/nownodes.io\/blog\/#\/schema\/person\/0890ec68e813adecb93c18ee00e1e7a8"},"headline":"How to Build a Web3 Chrome Extension","datePublished":"2026-10-20T14:07:49+00:00","dateModified":"2026-10-20T14:07:50+00:00","mainEntityOfPage":{"@id":"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/"},"wordCount":2007,"commentCount":0,"publisher":{"@id":"https:\/\/nownodes.io\/blog\/#organization"},"articleSection":["Dev Report"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/","url":"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/","name":"Web3 Chrome Extension: Step-by-Step Build Guide","isPartOf":{"@id":"https:\/\/nownodes.io\/blog\/#website"},"datePublished":"2026-10-20T14:07:49+00:00","dateModified":"2026-10-20T14:07:50+00:00","description":"Build a Web3 Chrome extension on Manifest V3: set up the project, read Ethereum data over RPC, connect a wallet with EIP-6963, and publish to the store.","breadcrumb":{"@id":"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nownodes.io\/blog\/how-to-build-a-web3-chrome-extension\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Blog","item":"https:\/\/nownodes.io\/blog"},{"@type":"ListItem","position":2,"name":"Dev Report","item":"https:\/\/nownodes.io\/blog\/category\/dev-report"},{"@type":"ListItem","position":3,"name":"How to Build a Web3 Chrome Extension"}]},{"@type":"WebSite","@id":"https:\/\/nownodes.io\/blog\/#website","url":"https:\/\/nownodes.io\/blog\/","name":"NOWNodes Blog","description":"Your first-to-go source of development guides, web3 analytics and most recent news about NOWNodes","publisher":{"@id":"https:\/\/nownodes.io\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nownodes.io\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/nownodes.io\/blog\/#organization","name":"NOWNodes Blog","url":"https:\/\/nownodes.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nownodes.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2024\/02\/cropped-New-Logo-NN.png","contentUrl":"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2024\/02\/cropped-New-Logo-NN.png","width":1164,"height":1164,"caption":"NOWNodes Blog"},"image":{"@id":"https:\/\/nownodes.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/twitter.com\/nownodes"]},{"@type":"Person","@id":"https:\/\/nownodes.io\/blog\/#\/schema\/person\/0890ec68e813adecb93c18ee00e1e7a8","name":"\u0410nastasia","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nownodes.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1de24ab8dcdd7ec30f6adaf78b56bc1eda421f87575b7e103c8fc3fc4420e833?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1de24ab8dcdd7ec30f6adaf78b56bc1eda421f87575b7e103c8fc3fc4420e833?s=96&d=mm&r=g","caption":"\u0410nastasia"},"url":"https:\/\/nownodes.io\/blog\/author\/nasty-nownodes"}]}},"modified_by":"\u0410nastasia","_links":{"self":[{"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/posts\/4153","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/comments?post=4153"}],"version-history":[{"count":1,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/posts\/4153\/revisions"}],"predecessor-version":[{"id":4157,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/posts\/4153\/revisions\/4157"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/media\/4156"}],"wp:attachment":[{"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/media?parent=4153"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/categories?post=4153"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/tags?post=4153"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}