Chrome extension for routing browser traffic through Novada residential proxies. Supports geo-targeting across 195+ countries and multi-provider fallback.
- Toggle proxy on/off from the browser toolbar
- Country selection (195+ countries)
- Sticky session support
- Multi-provider: Novada, BrightData, Smartproxy, Oxylabs, Generic
- Manifest V3 / Chrome 108+
- Clone this repo
- Open
chrome://extensions - Enable Developer mode
- Click Load unpacked → select this folder
- Open the extension settings → enter your Novada credentials → Save
Find your proxy credentials at dashboard.novada.com → Residential Proxies → Endpoint Generator.
| Field | Value |
|---|---|
| Username | Your zone username (e.g. user_XXXX) |
| Password | Your zone password |
| Host | Your endpoint (e.g. abc.vtv.na.novada.pro) |
| Port | 7777 |
The extension code is correct. This is a Novada proxy backend issue.
Chrome MV3 extensions authenticate with HTTP proxies via chrome.webRequest.onAuthRequired (asyncBlocking mode). This event fires only after Chrome receives a valid HTTP 407 Proxy Authentication Required challenge.
Novada's residential proxy returns a 407 response missing Content-Length and Connection headers:
HTTP/1.1 407 Proxy Authentication Required
Proxy-Authenticate: Basic realm=""
Proxy Authentication Required
Chrome reads the 407 headers, then waits to determine the body length. With no Content-Length, Chrome reads until connection close. When the connection closes, Chrome's network stack treats this as ERR_TUNNEL_CONNECTION_FAILED — not as a proper auth challenge. onAuthRequired never fires.
Step 1 — unauthenticated CONNECT (same as Chrome's first attempt):
→ HTTP/1.1 407 ✓ (proxy responds correctly)
→ No Content-Length, no Connection: close ✗
Step 2 — authenticated retry on same connection:
→ Empty response (connection already closed by proxy) ✗
Note: curl -U works because curl sends Proxy-Authorization preemptively,
skipping the 407 challenge entirely. Chrome cannot do this.
Change the proxy's 407 response to include Content-Length: 0:
HTTP/1.1 407 Proxy Authentication Required
Proxy-Authenticate: Basic realm="Proxy"
Content-Length: 0
Connection: close
This is the standard behavior of BrightData, Smartproxy, and Oxylabs — their Chrome extensions work because of this one header.
The extension has a built-in log panel (no Chrome debug port needed):
- Reload the extension at
chrome://extensions - Enable proxy from the popup
- Navigate to any HTTPS site (e.g.
https://ipinfo.io/json) - Open Options → scroll to bottom → click Read Log
Current output (before backend fix):
PROXY ERROR: {"error":"net::ERR_TUNNEL_CONNECTION_FAILED","fatal":true}
(onAuthRequired never appears — confirms Chrome never fires the event)
Expected output after backend fix:
onAuthRequired fired — isProxy:true url:https://ipinfo.io/json
Fast path — providing auth for: user_XXXX-zone-res-country-us
Popup (popup.html/js)
└─ chrome.runtime.sendMessage → Background Service Worker
├─ chrome.proxy.settings.set() — configures proxy
├─ chrome.webRequest.onAuthRequired — provides credentials (asyncBlocking)
└─ chrome.storage.local — persists credentials + state
| Permission | Purpose |
|---|---|
proxy |
Configure browser proxy settings |
webRequest |
Intercept proxy auth challenges |
webRequestAuthProvider |
Provide credentials for 407 challenges (MV3) |
storage |
Persist credentials and settings |
tabs |
Open test connection tab |
scripting |
Read test page body text |