The Problem

Users behind VPNs, proxies, or restrictive networks need to verify what the outside world actually sees: their public IP, whether DNS or WebRTC leaks expose their real location, and whether their proxy rules route traffic correctly. Manually checking each of these across multiple services is slow and error-prone.

What This Does

MyIP is a self-hosted IP diagnostics toolbox. It detects local and public IPv4/IPv6 addresses, runs WebRTC and DNS leak tests, checks website availability, measures global latency, performs MTR and Whois lookups, and tests browser fingerprints. The frontend/ directory contains the Vue 3 interface with nearly all features as standalone components, while api/ and common/ hold the server-side handlers and shared utilities.

The project is a fork of jason5ng32/MyIP with 11,729 stars. It ships with Docker support, GitHub Actions CI, and a test suite of 60 files.

How It Is Wired

Execution starts at frontend/main (the Vue entry point), which imports the app shell and routes to feature components like frontend/components/Advanced.vue and frontend/components/SpeedTest.vue. These components call API endpoints defined in api/ — for example, api/dns-leak-test.js and api/get-whois.js — which run server-side in backend-server.js. That server also mounts the frontend static build.

The two hub modules with the widest blast radius are common/logger.js (imported by 26 modules) and common/fetch-with-timeout.js (imported by 19). A change to either ripples across nearly every API handler. The import graph shows 192 internal modules and 233 edges with zero circular dependencies — clean structure, but the frontend/store module sits at instability 0.67 (imports 8, imported by 4), meaning it's both a dependency and a dependent, making it awkward to refactor.

The frontend is a PWA with dark mode and keyboard shortcuts, and the backend handles rate limiting, referer checks, and report generation via common/report-schema.js.

How To Use It

Setup — pnpm is the package manager. Install and start the dev server:

pnpm install
pnpm dev

Configuration — Copy .env.example to .env and set any required API keys or service endpoints. The Dockerfile and docker-compose.yml are present for containerized deployment.

Running it — For production, build the frontend and start the backend:

pnpm build
pnpm start

The backend-server.js serves both the API and the built frontend. Docker deployment is supported via docker-compose.yml.

Real-World Use

Deploy this behind a reverse proxy on a VPS to give your team a self-hosted diagnostics page. Users on VPNs can visit it to confirm their egress IP, check for DNS leaks, and verify proxy rules — without sending that data to a third-party service. The shareable report feature (api/share-report.js) lets users export results for support tickets.

Code Health & Issues

Static analysis found 66 issues: 24 high, 42 medium. The top findings:

  • High — Deep nesting (38 occurrences) in common/logger.js, frontend/components/Achievements.vue, and frontend/components/Advanced.vue. Max indentation depth of 8 makes control flow hard to follow.
  • High — Hub modules: common/logger.js and common/fetch-with-timeout.js each have 26 and 19 dependents respectively; changes have high blast radius.
  • High — Duplicated code blocks: 115 repeated 6-line blocks across 75 files, notably in api/get-user-info.js and common/maxmind-updater.js.
  • High — Oversized file: frontend/data/speedtest-colos.js at 1,323 lines.

Additional findings: third-party GitHub Actions are pinned to tags (@v4) not commit SHAs, no Dependabot configured, the Docker base image node:24-alpine is unpinned by digest, and the container runs as root. These are all medium-severity supply-chain and hardening issues.

The Bottom Line

This is a well-structured, feature-complete IP toolbox with clean module boundaries and no circular dependencies. The main maintenance risks are the duplicated logic and the oversized speedtest data file, plus the supply-chain hardening gaps. It's a solid choice for anyone who wants a self-hosted, privacy-respecting IP diagnostics suite.