A sleek, modern, and transparent privacy dashboard for your browser. GeoSpot provides an instant, live analysis of your IP address, geolocation, DNS leaks, and WebRTC leaks for both Chrome and Firefox.
- Cross-Browser Support: Fully functional on both Google Chrome and Mozilla Firefox, from a single shared codebase.
- Live IP & Geolocation: Instantly view your current public IP address, city, and country — with the last result cached briefly so re-opening the popup is instant instead of re-querying every time.
- Live DNS Leak Test: Automatically checks if your DNS queries are leaking and reveals the ISP of the leaking server.
- Transparent WebRTC Leak Test: Performs a live test to see if your browser is leaking your real IP via WebRTC, matching both IPv4 and IPv6 candidates. A same-family mismatch (e.g. your real IPv4 leaking despite a VPN) is reported as Leaking; a public IPv6 address exposed alongside an IPv4 VPN connection — which isn't necessarily a leak on a dual-stack connection — is reported separately as IPv6 Exposed rather than a false alarm.
- One-click leak fix (Chrome): When a WebRTC leak is found, a "Fix this leak" button appears that sets Chrome's
webRTCIPHandlingPolicytodisable_non_proxied_udp, closing the leak for new connections. (No equivalent extension API exists in Firefox, so the button only appears where it can actually do something.) Theprivacypermission is requested on demand, not at install. - Manual refresh: A refresh button forces an immediate re-check, bypassing the cache.
- Dynamic Country Icon: The extension icon is a dynamic, code-generated badge showing the two-letter country code of your current IP. It updates automatically via the
alarmsAPI. - Localized UI: English and Persian (فارسی) out of the box, via standard WebExtension
_locales. - Modern & Minimalist UI: A clean, visually appealing interface with a custom background and a locked-down, app-like feel.
- Zero Configuration: Works out of the box with no settings to configure.
You can load this extension in developer mode in your browser of choice.
- Download: Download or clone the repository and find the
chromefolder. - Open Chrome Extensions: Open Google Chrome and navigate to
chrome://extensions. - Enable Developer Mode: In the top right corner, toggle on "Developer mode".
- Load Unpacked: Click the "Load unpacked" button.
- Select Folder: Select the
chromefolder.
- Download: Download or clone the repository and find the
firefoxfolder. - Open Firefox Debugging: Open Firefox and navigate to
about:debugging. - Select "This Firefox": Click on the "This Firefox" tab on the left.
- Load Temporary Add-on: Click the "Load Temporary Add-on..." button.
- Select File: Navigate into the
firefoxfolder and select themanifest.jsonfile.
GeoSpot is built on the standard WebExtensions API, ensuring core functionality works seamlessly on both Chrome and Firefox with minimal manifest adjustments.
- IP & Geolocation: Fetches data from FreeIPAPI (
free.freeipapi.com) — HTTPS, no API key, no registration, 60 requests/minute on the free tier. The result is cached instorage.localfor ~55 seconds so the popup and the periodic background refresh don't double up on requests; a429response is surfaced to the user as "Rate Limited" rather than a generic failure. - DNS Leak Test: Uses the ipleak.net JSON API to get a list of DNS servers.
- WebRTC Leak Test: Implemented using the
RTCPeerConnectionAPI, waiting for ICE gathering to complete (not a fixed timer) and matching both IPv4 and IPv6 candidate addresses against the reported public IP, family-by-family (see Key Features above). - Leak remediation: On Chrome,
chrome.privacy.network.webRTCIPHandlingPolicycan be set at the user's request to stop the leak at the source, via an on-demandoptional_permissionsrequest rather than an install-time prompt. - Dynamic Icon: The icon is generated on-the-fly using the OffscreenCanvas API, refreshed periodically via the
alarmsAPI (notsetInterval, which is not reliable in a Manifest V3 service worker that can be suspended). - Localization: UI strings are pulled from
_locales/<lang>/messages.jsonviai18n.getMessage, following the browser's own language setting.
The Chrome and Firefox builds only genuinely differ in manifest.json (background script registration, CSP, browser_specific_settings). Everything else — popup.js, background.js, popup.html, and shared images — lives once under shared/ and is written against the promise-based browser.* namespace (Chrome is aliased to it automatically, see the shim at the top of popup.js/background.js).
GeoSpot-Project/
│
├── LICENSE
├── README.md
├── build.js # syncs shared/ into chrome/ and firefox/
├── .github/workflows/
│ └── verify-build-sync.yml # CI: fails if chrome/firefox drift from shared/
├── shared/
│ ├── background.js
│ ├── popup.html
│ ├── popup.js
│ ├── _locales/
│ │ ├── en/messages.json
│ │ └── fa/messages.json
│ └── images/
│ ├── background.jpg
│ └── icon16.png / icon48.png / icon128.png
├── chrome/
│ ├── manifest.json # hand-maintained, Chrome-specific
│ ├── background.js # generated — do not edit directly
│ ├── popup.html # generated
│ ├── popup.js # generated
│ ├── _locales/ # generated
│ └── images/ # generated + browser-specific screenshot
│
└── firefox/
├── manifest.json # hand-maintained, Firefox-specific
├── background.js # generated — do not edit directly
├── popup.html # generated
├── popup.js # generated
├── _locales/ # generated
└── images/ # generated + browser-specific screenshot
Edit files under shared/ (or add a new _locales/<lang>/messages.json), then run:
node build.js
to sync the change into both chrome/ and firefox/. Never edit popup.js, background.js, popup.html, or _locales/ directly inside chrome/ or firefox/ — those copies are overwritten on the next build. A GitHub Actions check (.github/workflows/verify-build-sync.yml) runs build.js on every push/PR and fails if it produces a diff, so drift between the two builds can't be merged silently again.
This project is licensed under the MIT License.
Created with ❤️ by GeekNeuron

