⚠️ Note: This project was created with Codex for testing purposes.
An all-in-one web app for IPv4/domain analysis, GeoIP, WHOIS, reputation checks, and staged port scanning (up to 6500).
- GeoIP (local-first, no external GeoIP APIs required)
geoip-litemaxmind(MMDB reader)@maxmind/geoip2-node(MMDB reader)- ASN enrichment via
@ip-location-db/geolite2-asn-mmdbfor ISP/ASN quality
- WHOIS + domain context (parsed fields + raw preview)
- Reputation checks (
dnsbl,privacy,community,crowdsec) - Two-stage port scan
- Stage 1: selected known ports
- Stage 2: remaining ports up to
6500
- Server-side scan history with share links and JSON download per entry
- Debug panel with provider status and rate-limit hints
- Multi-language UI: German, English, Dutch, French
- Encrypted config storage (
AES-256-GCM+scrypt)
- Backend: Node.js + Express
- Frontend: Vanilla HTML/CSS/JS
- Geo/Net libs:
geoip-lite,maxmind,@maxmind/geoip2-node,whois
- Node.js 18+ (24 recommended)
- npm
npm installRESOLVER_PASSWORD is mandatory.
PowerShell example:
$env:RESOLVER_PASSWORD="your-secure-password"
npm startOpen: http://localhost:3000
The app auto-detects MMDB files from:
data/GeoLite2-City.mmdbGeoLite2-City.mmdbin project rootGEOIP_MMDB_PATH- package files from
@ip-location-db/geolite2-city-mmdb - package files from
@ip-location-db/geolite2-asn-mmdb
Target paths for auto-copy can be controlled by env vars:
GEOIP_MMDB_PATHorGEOIP_CITY_MMDB_PATH(city DB target)GEOIP_ASN_MMDB_PATH(ASN DB target)
The postinstall script (scripts/setup-mmdb.js) copies both MMDBs automatically when available:
data/GeoLite2-City.mmdbdata/GeoLite2-ASN.mmdb
If MMDB readers are unavailable, the app gracefully falls back to geoip-lite.
The MMDB files are derived from MaxMind GeoLite2 and are not committed to this repository (they ship with the npm packages above and are copied locally on install). Please respect the GeoLite2 EULA before redistributing them.
Via in-app config panel:
- site title
- history retention limit
- remaining-scan speed (ports/sec)
- enabled GeoIP providers
- enabled reputation providers
- optional site access password
- logo + favicon upload
Encrypted config file:
data/site-config.enc
The debug run tests GeoIP/WHOIS/Reputation providers and surfaces reasons like:
rate_limitedhttp_429request_faileddisabled_in_config
Useful for validating provider behavior after config changes.
Use the included docker-compose.yml.
Copy .env.example to .env and set your own password:
RESOLVER_PASSWORD=your-secure-passworddocker compose up --buildCompose includes:
- Node
24-alpine RESOLVER_PASSWORDinjected from.env(never hardcode it in the compose file)- a bind mount for
/appsodata/andpublic/history/persist on the host
server.js- API, scan engine, provider logicpublic/index.html- UI layoutpublic/app.js- frontend logic, state, i18npublic/styles.css- styling + responsive behaviorpublic/locales/-de,en,nl,frpublic/history/- persisted scan records (gitignored)data/- encrypted config + runtime assets (gitignored)scripts/setup-mmdb.js- MMDB bootstrap
Only scan systems you own or are explicitly authorized to test.