GitHub RadarBlue team tool
A local, privacy-first Chrome extension that detects phishing sites in real time using heuristics + a locally-trained ML model. No cloud, no external APIs. Primary language: JavaScript. 6 stars.
Inferred from repository metadata; not a reviewed classification.
Project links:Open GitHub projectBack to radar
<p align="center"> <img src="icons/icon128.png" alt="MySitePeak Logo" width="100"> </p>
<h1 align="center">MySitePeak</h1>
<p align="center"><strong>A local, privacy-first browser extension that detects phishing and suspicious websites in real time.</strong></p>
Built as a personal cybersecurity project to understand how phishing detection actually works — from URL-based heuristics to a locally-trained machine learning model to live webpage source analysis — while keeping everything 100% local. No cloud services, no external APIs, no user data ever leaves the browser.
<p align="center"> <img src="screenshots/low-risk-example.png" width="270" alt="Low risk result on a trusted site"> <img src="screenshots/medium-risk-example.png" width="270" alt="Medium risk result on an HTTP-only site"> <img src="screenshots/high-risk-example.png" width="270" alt="High risk result on a raw-IP, non-HTTPS URL"> </p>
<p align="center"><em>Left to right: a trusted site (low risk), a plain-HTTP site (medium risk), and a raw-IP, non-HTTPS URL (high risk). Each verdict comes with clear, per-signal reasoning.</em></p>
<p align="center"> <img src="screenshots/vault-unlock.gif" width="270" alt="Vault unlock animation when the popup opens"> </p>
<p align="center"><em>The popup opens with a vault-unlock animation while the real scan runs underneath, then reveals the result.</em></p>
paypa1.com)Beyond URL-level heuristics and ML, MySitePeak includes a dedicated module (source_analyzer.js) that inspects the live webpage itself for phishing patterns — isolated from the core URL/ML detection so it can be developed, tested, and disabled independently.
Live checks:
| Check | What it detects | |---|---| | Login/password form detection | Presence of credential-harvesting forms (baseline signal) | | Cross-domain form submission | A login form posting data to a domain other than the page itself | | Insecure login form | A login form on plain HTTP, or submitting over HTTP | | IP-based form action | A form submitting to a raw IP address instead of a domain | | Brand/title-domain mismatch | Page title claims a brand (e.g. "PayPal") the domain doesn't match | | Suspicious link text/domain mismatch | Link text names a brand but points to an unrelated, untrusted domain | | Typosquat detection | Domain is a 1-2 character edit away from a known brand's real domain (Levenshtein distance) | | Deceptive subdomain | A real brand's domain embedded as a fake subdomain (e.g. paypal.com.security-verify.xyz) | | Clipboard hijacking | Inline scripts overriding copy/paste near what looks like a crypto wallet address | | Urgency/account-security language | Phrases like "account will be suspended" commonly used in phishing pressure tactics |
Several checks are gated behind the Tranco allowlist (skipped entirely on already-trusted domains) specifically to avoid flagging legitimate sites — see Design Decisions below for why that gate exists.
Deliberately shelved (built, tested, found unsafe to ship as-is):
| Check | Why it was shelved | |---|---| | Hidden iframe detection | Legitimate sites (reCAPTCHA, payment widgets, chat tools) routinely use hidden iframes — too noisy to be a reliable signal | | Hidden form detection | Same problem, even more common — mobile nav menus, search overlays, modals all hide real forms by design | | Cross-domain meta-refresh | Real companies use this exact pattern for legitimate domain migrations (confirmed via Docker's own docs site); also prone to a timing race against the redirect itself | | Punycode/IDN domain detection | window.location.hostname returns Punycode for any non-Latin domain, safe or malicious — would flag legitimate international websites |
Shelving a check that doesn't hold up under real-world testing, rather than shipping it anyway, is a deliberate choice — see below.
A few judgment calls worth calling out, since they shaped how this module was built:
.co.in and .co.uk (e.g. airbnb.co.in was initially misread as the domain co.in) — caught by testing against a real site, not a hypothetical.MySitePeak is built on Manifest V3, and works across all major browsers:
Since this isn't published on any extension store, install it manually:
Chrome / Brave / Edge / Opera:
git clone https://github.com/parth15codes/MySitePeak.gitchrome://extensionsMySitePeak folderFirefox:
about:debugging#/runtime/this-firefoxmanifest.json from the cloned folderThe extension ships with a pre-trained model (forest_model.json), so this step isn't required to use the extension. If you want to retrain it yourself:
ml/ml/ as tranco_top1m.csv python -m venv venv
source venv/Scripts/activate # or venv/bin/activate on Mac/Linux
pip install pandas scikit-learn joblib cd ml
python train_model.py
python export_model.pyMySitePeak is an actively developed personal project, not a production-grade security tool. The ML model's confidence scores are currently logged for development purposes only (not shown in the UI) while accuracy is further improved. The heuristic engine and SourceAnalyzer module are the primary, user-facing detection layers.
MIT License — see LICENSE for details.