A web reconnaissance dashboard and CLI for authorized passive intelligence gathering and active vulnerability checks — built for bug bounty hunters, security engineers, and auditors.
🚀 Try the live demo → — point it at a target you own and explore the recon report. No signup required.
| Link | Description |
|---|---|
| 🌐 Live demo | Hosted dashboard at abspider.zanesense.dev |
| 📦 npm package | Run the local CLI with npx abspider example.com |
| 📦 Repository | Source code, issues, and releases |
| 🐛 Issue tracker | Report bugs and request modules |
| 🔀 Pull requests | Open a PR to contribute a payload or module |
| ⭐ Stargazers | See who starred the project |
| 📄 License | MIT terms |
| 🛡️ Security policy | Reporting vulnerabilities in ABSpider itself |
| 📚 Wiki | Extended configuration, legal, and user guides |
| 🤖 DeepWiki | AI-generated repository documentation |
- 📖 Overview
- ✨ Features
- 🛰️ Reconnaissance Modules
- 🧠 How It Works
- 📂 Repository Structure
- 🧰 Tech Stack
- 📋 Requirements
- 🛠️ Installation
- ⚙️ Configuration
- 🛠️ Usage
- 🧪 Testing
- 🔄 Project Flow
- 🔌 API Reference
- 💡 Examples
- 🚀 Deployment
- 🗺️ Roadmap
- 🤝 Contributing
- 📝 Changelog
- 🛟 Troubleshooting
- 🔐 Security and Legal Use
- 📄 License
- ❤️ Acknowledgements
- 👥 Contributors
Most public web attacks start with the same recon: a DNS lookup, a certificate transparency query, a port scan, a header review, and a handful of well-known payload checks. ABSpider Recon is a focused, opinionated recon toolkit that bundles those workflows behind one dashboard and one terminal command. It is built for:
- 🐛 Bug bounty hunters who need a fast first pass against an in-scope target.
- 🛡️ Security engineers running pre-audit reconnaissance on assets they own.
- 🎓 Students and educators teaching the structure of a modern web recon workflow.
- 🧰 Tooling authors who want a clean JSON recon payload to feed into other tools.
⚠️ Authorization is non-negotiable. ABSpider Recon is a security testing tool. It does not grant permission to scan any system. Use it only on assets you own or have explicit written authorization to test. See 🔐 Security and Legal Use.
It is built on a clear split:
- 🖥️ Dashboard — a Vite + React + Supabase app with a polished UI, magic-link auth, persisted scan history, JSON/PDF report export, and per-user settings.
- 💻 CLI — a Node.js ESM script that runs the same recon modules from the terminal, with bounded payload counts, request delays, and thread controls. No Supabase session required.
Both surfaces share the same scanner engine. Pick whichever fits the engagement.
- 🛰️ 21 recon modules spanning passive intelligence, header analysis, fingerprinting, and bounded active checks.
- 🧠 Three scan styles —
conservative,adaptive(default), andaggressive— for both dashboard and CLI workflows. - 🛡️ Bounded by design — every active module has explicit payload counts, request delays, and concurrency limits. Nothing fires blindly.
- 💻 Local CLI — run the full scanner from your terminal with
npx abspider <target>, ornpm run cli -- <target>for local development. - 🔐 Passwordless auth — Supabase magic-link sign-in protects dashboard history; the CLI runs without any account.
- 📊 Per-user scan history — Supabase PostgreSQL with row-level security, plus per-user API keys, preferences, and Discord webhook config.
- 📥 JSON + PDF reports — export a dashboard scan as JSON, a styled PDF (
jsPDF+jspdf-autotable), or DOCX. - 🧩 Optional third-party intel — Shodan, VirusTotal, SecurityTrails, Hunter.io, and Discord webhooks plug in when you bring your own keys.
- 🐳 Container-ready — production
Dockerfile(Nginx) and devDockerfile.dev(Vite) ship in the repo;docker composeorchestrates both. - ⏱️ Graceful shutdown —
Ctrl+Caborts the CLI cleanly, preserves partial results, and finishes writing any--outputJSON. - 🧪 Strict pipeline — ESLint 9, strict TypeScript, Vitest, and
npm audit(production only) run in CI on every push and PR.
| Module | Dashboard | CLI flag | Type | Purpose |
|---|---|---|---|---|
| Site Info | ✅ | siteInfo |
Passive | Status, title, server, IP, and response metadata. |
| Headers | ✅ | headers |
Passive | Scores common security headers (CSP, HSTS, XFO, Referrer-Policy, Permissions-Policy). |
| WHOIS / RDAP | ✅ | whois |
Passive | Domain registration, registrar, nameservers, and creation/expiry dates. |
| GeoIP | ✅ | geoip |
Passive | IP ownership and approximate geolocation. |
| DNS | ✅ | dns |
Passive | A, AAAA, MX, NS, TXT, CNAME, and SOA records. |
| MX | ✅ | mx |
Passive | Mail exchange records and preference order. |
| Subnet | ✅ | subnet |
Passive | Basic IPv4 /24 network summary when an IP is available. |
| Subdomains | ✅ | subdomains |
Passive | DNS wordlist, crt.sh certificate transparency, and optional SecurityTrails results. |
| Reverse IP | ✅ | reverseip |
Passive | Other domains on the same IP. |
| VirusTotal | ✅ | virustotal |
Passive | Domain reputation when an API key is configured. |
| SSL / TLS | ✅ | sslTls |
Passive | Certificate subject, issuer, SANs, fingerprint, and expiry. |
| Tech Stack | ✅ | techStack |
Passive | Frontend, CMS, analytics, CDN, and server fingerprinting. |
| SEO | ✅ | seo |
Passive | Title, meta description, canonical URL, headings, and link counts. |
| Ports | ✅ | ports |
Active | Web, common, or full TCP port profiles with bounded concurrency. |
| SQL Injection | ✅ | sqlinjection |
Active | Loads src/payloads/sqli.json and uses baseline-aware SQL error heuristics. |
| XSS | ✅ | xss |
Active | Loads src/payloads/xss.json and reports unencoded payload reflection. |
| LFI | ✅ | lfi |
Active | Loads src/payloads/lfi.json and matches known file-content markers. |
| WordPress | ✅ | wordpress |
Active | Checks common WordPress paths (/wp-login.php, /wp-json/, /xmlrpc.php). |
| Broken Links | ✅ | brokenLinks |
Active | Walks discovered links and reports unreachable ones. |
| CORS | ✅ | corsMisconfig |
Active | Tests wildcard or reflected arbitrary-origin CORS responses. |
| DDoS / WAF | ✅ | ddosFirewall |
Active | Sends a bounded sequence of HEAD requests and records rate-limit signals. |
🔎 Dashboard-only convenience modules (settings, preferences, key vault) live under
src/services/and are not part of the recon flow.
ABSpider Recon is a Vite SPA backed by Supabase. The browser is the only client; the scanner modules run inside the browser for the dashboard and inside Node.js for the CLI. Both surfaces share the same module contracts.
flowchart TD
A[User enters a target] --> B{Dashboard or CLI?}
B -- Dashboard --> D[React SPA]
B -- CLI --> C[abspider-cli.mjs]
D --> E[Supabase auth and per-user settings]
D --> F[Scan service orchestrator]
C --> M[CLI module runner]
F --> X[Recon modules]
M --> X
X --> Y[External targets and intel sources]
F --> R[PDF and JSON reports]
C --> J[Terminal report and JSON export]
F --> DB[(Supabase Postgres + Storage)]
Key design choices:
- Browser-first dashboard — the dashboard does the work in the browser using a small
requestManagerand per-module backoff. The Vercel Edge proxy atapi/proxy.tsis available for CORS-limited flows. - Bounded active modules — every active module reads payloads from
src/payloads/*.jsonand respects the per-mode cap, delay, and concurrency settings. - Deterministic payloads — the JSON payload files are version-controlled. You can audit, extend, or replace them without touching the runner.
- No telemetry — ABSpider Recon does not phone home. API keys never leave your browser session, and scan results are scoped to your Supabase row-level security policies.
abspider-recon/
├── api/
│ └── proxy.ts # Vercel Edge Runtime proxy endpoint
│
├── docs/
│ └── wiki/ # Supplemental user, configuration, legal guides
│
├── packages/
│ └── cli/ # Published npm package `abspider`
│ ├── package.json # bin: abspider, abspider-recon
│ ├── README.md # npm-facing usage docs
│ └── scripts/abspider-cli.mjs # CLI entry point bundled into the npm tarball
│
├── public/ # Favicons, manifest, robots.txt, static assets
│
├── scripts/
│ ├── abspider-cli.mjs # Local CLI runner (used by `npm run cli`)
│ └── generate-favicons.js # Favicon regeneration helper
│
├── src/
│ ├── App.tsx # Router, providers, app shell
│ ├── main.tsx # Vite entry point
│ ├── SupabaseClient.ts # Typed Supabase client
│ ├── components/ # Dashboard UI components
│ │ ├── landing/ # Landing-page sections (Hero, Features, Stats, CTA, ...)
│ │ └── ui/ # shadcn-style primitives (button, card, dialog, sidebar, ...)
│ ├── contexts/ # Theme + notification React contexts
│ ├── hooks/ # Custom React hooks
│ ├── images/ # Inline SVGs and brand assets
│ ├── lib/ # Shared utilities
│ ├── pages/ # React Router pages
│ ├── payloads/ # SQLi, XSS, and LFI payload JSON files
│ ├── services/ # 21 recon modules, report generation, settings, scan orchestrator
│ ├── shims/ # Type shims
│ └── utils/ # cn(), formatters, small helpers
│
├── supabase/
│ └── migrations/ # 0001 init schema, 0002 RLS, 0003 storage
│
├── .env.example # Template for VITE_* env vars
├── components.json # shadcn/ui config
├── docker-compose.yml # `app` and `dev` profiles
├── Dockerfile # Production Vite build served by Nginx on :8080
├── Dockerfile.dev # Vite dev server on :5000
├── eslint.config.js # ESLint 9 + typescript-eslint
├── LICENSE # MIT
├── nginx.conf # Nginx config for the production image
├── package.json # Scripts, dependencies, and CLI runner
├── postcss.config.js # Tailwind + Autoprefixer
├── README.md # You are here
├── SECURITY.md # Vulnerability reporting policy
├── tailwind.config.js # Tailwind v3 design tokens
├── tsconfig.app.json # Strict TS config for the app
├── tsconfig.json # Root TS config
├── tsconfig.node.json # TS config for Node scripts
└── vite.config.ts # Vite config and path aliases
| Layer | Choice |
|---|---|
| Framework | Vite 6 + React 18 + React Router 7 |
| Language | TypeScript 5 (strict mode) |
| Styling | Tailwind CSS 3 + shadcn/ui (locally authored) + Radix UI + Lucide |
| State and forms | TanStack Query 5, React Context, React Hook Form 7, Zod 3 |
| Auth and persistence | Supabase Auth, PostgreSQL, Storage, Row Level Security |
| Reports | jsPDF, jspdf-autotable, docx |
| CLI | Node.js ≥ 20 ESM script using built-in fetch, dns, net, and tls |
| Deployment | Vercel (Edge proxy), Docker + Nginx, self-hosted static |
| Linting | ESLint 9 + typescript-eslint |
| Type checking | tsc -b --noEmit |
| Testing | Vitest 2 |
| CI | GitHub Actions: lint, typecheck, build, test, and npm audit --omit=dev |
- Node.js ≥ 20 (CI runs on Node 20; the published CLI requires Node ≥ 20).
- npm ≥ 9 with the committed
package-lock.json(abun.lockis also present for Bun users). - Supabase project for the dashboard auth, persisted scan history, and per-user settings.
- Optional API keys for enhanced modules (Shodan, VirusTotal, SecurityTrails, Hunter.io, Discord).
- Docker, only if you want containerized deployment.
The CLI can run without Supabase or any third-party keys. Core passive modules (DNS, WHOIS, headers, SSL, ports) work out of the box on a fresh clone.
# 1. Clone the repository
git clone https://github.com/zanesense/abspider-recon.git
cd abspider-recon
# 2. Install dependencies
npm install
# 3. Copy and populate environment variables
cp .env.example .env
# Edit .env with your Supabase project URL and anon key (see Configuration below)
# 4. Apply Supabase migrations
supabase link --project-ref <YOUR_PROJECT_REF>
supabase db push
# 5. Start the dev server
npm run devThe Vite dev server listens on port 5000 by default:
http://localhost:5000
The CLI is published as abspider and ships its own bundled abspider-cli.mjs plus the payload JSON files. Install it once and run it anywhere:
# One-off scan
npx abspider example.com
# Or install globally
npm install -g abspider
abspider example.comFor local development from this repository (uses the source tree under packages/cli):
npm run cli -- example.comnpm run buildnpm run build runs the strict TypeScript project references (tsc -b) and then vite build, producing a static bundle in dist/. Serve dist/ from any static host, or use the production Docker image.
ABSpider Recon is configured entirely through environment variables. There is no separate config file to edit and no database to provision up front.
| Variable | Required | Default | Description |
|---|---|---|---|
VITE_SUPABASE_URL |
✅ | none | Supabase project URL, e.g. https://YOUR-PROJECT-REF.supabase.co. |
VITE_SUPABASE_ANON_KEY |
✅ | none | Supabase anon publishable key. Protect your data with Row Level Security. |
VITE_SHODAN_API_KEY |
⛔ | none | Enables Shodan-backed lookups where supported. |
VITE_VIRUSTOTAL_API_KEY |
⛔ | none | Enables VirusTotal domain reputation checks in the dashboard. |
VITE_SECURITYTRAILS_API_KEY |
⛔ | none | Enables SecurityTrails-backed DNS intelligence where supported. |
VITE_HUNTER_API_KEY |
⛔ | none | Enables Hunter.io-backed email intelligence where supported. |
VITE_DISCORD_WEBHOOK_URL |
⛔ | none | Sends scan notifications to a Discord webhook. Treat this as a secret. |
Vite only exposes variables prefixed with
VITE_to the browser bundle. Anything unprefixed stays server-side.
Copy the template to start:
cp .env.example .env
# .env is already in .gitignoreApply the migrations in supabase/migrations/ before using the dashboard end to end:
supabase link --project-ref <YOUR_PROJECT_REF>
supabase db pushIf you do not use the Supabase CLI, run these files in the Supabase SQL Editor in order:
supabase/migrations/0001_init_schema.sqlsupabase/migrations/0002_rls_policies.sqlsupabase/migrations/0003_storage_avatars.sql
See supabase/README.md for verification steps and a quick "expected tables" checklist.
The CLI only reads the VirusTotal key from your shell environment (it does not load .env):
export VIRUSTOTAL_API_KEY=<your-key>
abspider example.com --modules virustotalAll other CLI modules run without configuration.
npm run devThen:
- Sign in with a Supabase magic link (no password to remember).
- Open Settings and add any optional API keys, the proxy URL, and your Discord webhook.
- Start a scan from the New Scan page by entering a target.
- Watch per-module progress and review the structured results.
- Export the report as JSON, PDF, or DOCX from the Reports page.
The CLI ships with a clean terminal UI, per-module progress bars, and immediate results. It runs without a Supabase session and without any third-party keys for the core modules.
# Default: passive recon only
abspider example.com
# Every passive and active CLI module
abspider https://example.com --all
# Only active checks, with conservative settings
abspider https://example.com --active --mode conservative
# Selected modules, save JSON for a downstream tool
abspider example.com --modules whois,dns,sslTls,ports,cors --output scan.json
# Aggressive mode with the common port profile
abspider https://example.com --all --mode aggressive --port-profile common
# Machine-readable JSON to stdout
abspider example.com --modules dns,sslTls --json --prettyOperational notes:
- Press
Ctrl+Cto stop gracefully. The CLI aborts in-flight work, skips remaining modules, and preserves any partial JSON written via--output. - The CLI runs in Node.js, so browser CORS restrictions do not apply.
- CDN/WAF protections (e.g. Cloudflare) are detected and reported when visible in headers, status codes, or challenge pages. The CLI does not evade access controls or bypass provider challenges.
There are two ways to consume ABSpider Recon programmatically:
- The Vercel Edge proxy at
GET /api/proxy?url=<encoded>— for browser-side CORS-bypass workflows. - The CLI JSON output — pipe
--jsonintojqor another tool for automations.
See 🔌 API Reference for full details.
Landing page
Login
Dashboard
New scan
Running scan
CLI
ABSpider Recon ships with a strict quality pipeline. Run all of these locally before opening a PR:
# Lint
npm run lint
# Type check (strict TypeScript project references)
npm run typecheck
# Build the production bundle (catches many runtime issues at build time)
npm run build
# Unit tests (Vitest)
npm test
# Audit production dependencies for known CVEs
npm run auditThe GitHub Actions workflow runs lint, typecheck, build, and test on every push and pull request to main. npm run audit is intended for local pre-release checks; the lockfile is committed and package-lock.json is the source of truth.
End-to-end recon lifecycle (dashboard or CLI):
sequenceDiagram
participant U as User
participant W as Dashboard (Vite + React)
participant C as CLI (abspider-cli.mjs)
participant S as Supabase
participant T as Target host and intel sources
participant R as Recon modules (src/services)
participant E as Report exporter
U->>W: Sign in with magic link
W->>S: Authenticate and load user settings
U->>W: Enter a target
W->>R: Run selected modules (bounded)
R->>T: HTTP, DNS, TCP, TLS probes
T-->>R: Responses and metadata
R-->>W: Structured findings
W->>E: Build JSON, PDF, DOCX
W->>S: Persist scan history (RLS-scoped)
W-->>U: Render report and exports
U->>C: abspider example.com --all
C->>R: Run selected modules
R->>T: Same probes
T-->>R: Responses
R-->>C: Findings
C-->>U: Terminal UI, JSON, --output file
A minimal Vercel Edge proxy used to bypass browser CORS for targets that reject cross-origin requests. The handler in api/proxy.ts:1 validates the url query parameter, forwards a curated set of request headers, and returns the target response with permissive CORS headers.
Request
GET /api/proxy?url=https%3A%2F%2Fexample.com%2Frobots.txt| Query param | Required | Description |
|---|---|---|
url |
✅ | Absolute, fully qualified URL to fetch. Must parse with new URL(). |
Response
200 OKwith the proxied body andAccess-Control-Allow-Origin: *.400 Bad Requestifurlis missing.500 Internal Server Erroron upstream failure.
CORS
The proxy itself responds to OPTIONS preflight with Allow: GET, POST, OPTIONS and the standard CORS response headers.
Use the proxy only for hosts you are authorized to test. It is not a generic web proxy.
Pass --json to print the full result tree, or --json --pretty for human-readable JSON. Use --output <file> to write it to disk. The shape is:
{
"target": "example.com",
"startedAt": "2026-06-07T10:00:00.000Z",
"finishedAt": "2026-06-07T10:00:14.000Z",
"durationMs": 14000,
"mode": "adaptive",
"modules": {
"siteInfo": { "ok": true, "data": { "status": 200, "title": "Example Domain" } },
"dns": { "ok": true, "data": { "A": ["23.215.0.136"], "AAAA": ["2600:1408:..."] } },
"whois": { "ok": true, "data": { "registrar": "...", "createdAt": "..." } },
"sslTls": { "ok": true, "data": { "subject": "CN=example.com", "expiresAt": "..." } }
},
"summary": {
"modulesRun": 4,
"modulesOk": 4,
"modulesFailed": 0,
"findings": 0
}
}Field shape varies per module. Treat the JSON as additive — new fields may appear in future releases without a major version bump.
⚠️ Authorization reminder. The targets below are commonly used for testing and are either owned by the named organization or explicitly offered for scanner demos. Do not run the active modules against any host without written permission.
| Target | Modules to run | Notes |
|---|---|---|
example.com |
siteInfo, headers, whois, dns, sslTls, seo |
IANA-owned; safe for full passive recon. |
httpbin.org |
siteInfo, headers, corsMisconfig, brokenLinks |
Returns whatever you ask for; great for verifying CLI behavior. |
scanme.nmap.org |
ports (mode conservative) |
Maintained by the Nmap project for port-scanner testing. |
| Your own staging host | --all |
The recommended way to use the active modules. |
For a deeper walkthrough, see docs/wiki/user-guide.md.
A corsMisconfig finding produced by the CLI in --json mode:
{
"module": "corsMisconfig",
"severity": "high",
"title": "CORS reflects arbitrary Origin",
"description": "The response includes Access-Control-Allow-Origin: <request-origin> with Access-Control-Allow-Credentials: true. This is a classic CORS misconfiguration.",
"target": "https://staging.example.com",
"evidence": {
"requestOrigin": "https://evil.example",
"responseHeaders": {
"access-control-allow-origin": "https://evil.example",
"access-control-allow-credentials": "true"
},
"status": 200
},
"remediation": "Reflect only a known allowlist of origins, or set Access-Control-Allow-Origin to a static value and never combine it with Access-Control-Allow-Credentials: true for dynamic origins."
}The same finding in the dashboard renders as a card with a "Recheck" button, an evidence panel, and a copy-pasteable remediation block.
ABSpider Recon is a static Vite SPA plus a Vercel Edge function at api/proxy.ts. Every supported deployment path serves the production bundle in dist/ — never the Vite dev server. The Vite dev server (npm run dev, port 5000) is for local development only and is not exposed by any of the deployment recipes below.
| Path | Front-end served from | api/proxy supported? |
|---|---|---|
| Vercel (recommended) | dist/ built by Vite |
✅ — Vercel Edge Function |
| Docker production | dist/ served by Nginx |
❌ — proxy not bundled in the image |
| Self-hosted Node | dist/ served by serve |
❌ — host the proxy separately or drop it |
| Static host (S3, Caddy, Netlify, …) | dist/ uploaded as-is |
❌ — bring your own runtime for the proxy |
Vercel reads vercel.json and runs the production pipeline:
installCommand:npm cibuildCommand:npm run build(which istsc -b && vite build)outputDirectory:dist/- SPA rewrites: every path that does not match a static asset falls through to
/index.html(so deep links like/dashboardand/scan/:idwork after a refresh). - Edge function:
api/proxy.tsis auto-deployed as a Vercel Edge Function.
# Install the Vercel CLI if you do not have it
npm i -g vercel
# Deploy from the project root
vercelIn the Vercel project settings, add:
VITE_SUPABASE_URLVITE_SUPABASE_ANON_KEY- Optional
VITE_*integration keys
No
vercel devfor the deployed environment. The platform always runs the production build, never the Vite dev server.
The production image is a multi-stage build: Node 20 builds the Vite bundle, then a distroless Nginx 1.27 alpine image serves dist/ on container port 8080. The Vite dev server is never started inside the image.
docker compose up --build appOpen:
http://localhost:3000
Verify the image is actually serving the production build:
# Should print "nginx" in the Server header
curl -sI http://localhost:3000 | grep -i serverThis is the only path that runs the Vite dev server, and it is opt-in via a Compose profile.
docker compose --profile dev up --build devOpen:
http://localhost:5000
npm start runs serve (Vercel's reference static file server) against dist/, with the SPA fallback flag (-s) so deep links resolve to index.html. The Vite preview server is not used.
npm ci
npm run build
VITE_SUPABASE_URL=https://YOUR-PROJECT-REF.supabase.co \
VITE_SUPABASE_ANON_KEY=replace-with-your-supabase-anon-key \
PORT=5000 \
npm startPORT defaults to 5000 if unset.
npm run build
# Upload the contents of dist/ to your static hostIf your static host supports edge functions (Cloudflare Workers, Netlify Edge Functions, Deno Deploy, Lambda@Edge), you can port the 92-line api/proxy.ts handler verbatim. Otherwise, run the dashboard without the proxy and rely on direct CORS-friendly targets or the CLI.
Planned and aspirational improvements:
- 📡 Multi-target batch scanning.
- 🧪 Custom payload libraries and per-engagement profiles.
- 🛡️ Advanced WAF fingerprinting and provider detection.
- 📄 Report templates for common assessment types.
- 🔌 Integrations with Burp Suite and OWASP ZAP.
- 👥 Team collaboration features (shared scan history, RBAC).
- 🏢 Backend API mode for enterprise deployments.
- 🌐 i18n for module output and report exports.
- 🪝 Webhook callbacks for scheduled scans.
- 🪪 License detection beyond VirusTotal metadata.
A separate
ROADMAP.mdis not currently checked in. The list above is the source of truth until it is.
Contributions are very welcome — especially new payload patterns, new recon modules, and per-provider fingerprinting rules.
- Fork the repository on GitHub.
- Clone your fork and create a feature branch:
git checkout -b feat/wordpress-plugin-fingerprint
- Install dependencies and start the dev server:
npm install npm run dev
- Make your changes.
- Adding a new module? Create a service under
src/services/that follows the existing shape, then wire it into the dashboard orchestrator and the CLI runner. - Adding payloads? Edit the relevant JSON file in
src/payloads/and document each new pattern in a PR comment.
- Adding a new module? Create a service under
- Run the quality checks before committing:
npm run lint npm run typecheck npm run build npm test - Commit with a descriptive message:
git commit -m "feat(services): add WordPress plugin fingerprinting" - Push your branch and open a pull request against
main:git push origin feat/wordpress-plugin-fingerprint
Please open an issue first if your change is large or design-related.
Releases are tracked on the GitHub Releases page. The notable milestones so far:
- 2.0.1 — Current. Polished landing page, redesigned app shell, expanded module list, hardened CLI modes, Supabase row-level security across all dashboard tables.
- 2.0.0 — Major rewrite. Split the project into the dashboard SPA and the published
abspiderCLI package (packages/cli). Introduced the Vercel Edge proxy, persistent scan history, JSON/PDF/DOCX reports, and per-user settings. - 1.x — Pre-split recon dashboard. Single Vite app with a smaller module set and no published CLI.
A standalone
CHANGELOG.mdis not currently committed. The GitHub Releases page is the source of truth until it is.
| Symptom | Cause | Fix |
|---|---|---|
| Dashboard cannot load scans | Supabase migrations have not been applied, or .env has the wrong URL/anon key. |
Run supabase db push (or apply the SQL files in order) and confirm VITE_SUPABASE_URL / VITE_SUPABASE_ANON_KEY. |
| Sign-in works but no rows are visible | Row Level Security policies from 0002_rls_policies.sql were not applied. |
Re-apply migration 0002_rls_policies.sql in the Supabase SQL Editor. |
| VirusTotal module is skipped in the CLI | VIRUSTOTAL_API_KEY is not set. |
export VIRUSTOTAL_API_KEY=<your-key> in your shell, or set VITE_VIRUSTOTAL_API_KEY for the dashboard. |
| CLI active modules are too noisy | Default mode is adaptive; payload counts and delays are tuned for a balance. |
Lower --payloads, raise --delay, or pass --mode conservative. |
| CLI scan is too slow | Mode is aggressive and threads are high. |
Use --mode conservative, lower --threads, choose --port-profile web, or disable CT lookup with --no-ct. |
| CLI reports a Cloudflare or WAF challenge | The target is behind a CDN/WAF that returned a challenge page. | Results describe the edge challenge instead of the origin. Use an authorized allowlist, staging host, or provider-approved testing path. |
| Browser scan hits CORS limitations | The target rejects cross-origin requests from the dashboard. | Use the CLI for server-side requests, or send dashboard traffic through the api/proxy endpoint. |
| Port checks fail with permission or network errors | Local firewall or network policy is blocking outbound TCP. | Run from a network that allows outbound TCP checks and verify local firewall rules. |
| Docker production serves a blank page | Required VITE_* env vars were not provided at build time. |
Rebuild the image with the env vars set, or inject them through your platform's build settings. |
cp fails on Windows PowerShell |
cp is not a native cmdlet. |
Use Copy-Item .env.example .env instead. |
tsc -b errors after pulling new code |
The TS incremental cache is stale. | Delete tsconfig.app.tsbuildinfo, tsconfig.node.tsbuildinfo, and .next/dist, then rerun npm run typecheck. |
More guides are available in docs/wiki.
ABSpider Recon is a security testing tool. It does not grant permission to scan any system.
- ✅ Authorization first. Scan only assets you own or have explicit written permission to test.
- ✅ Keep authorization records. For professional assessments, retain the signed scope of work.
- ✅ Tune for production. Use conservative payload counts, delays, and port profiles against production systems.
- ✅ Treat keys as secrets. Webhook URLs and third-party API keys must never be committed to source control.
- ✅ Mind the local laws. Computer-misuse laws differ by jurisdiction. You are responsible for compliance.
- ❌ No evasion. ABSpider Recon detects and reports CDN/WAF behavior; it does not bypass access controls or provider challenges.
- ❌ No data exfiltration. The dashboard does not share your scan results with any third party.
To report a vulnerability in ABSpider Recon itself, use the GitHub Security Advisories flow or email security@zanesense.dev. Do not open a public issue for suspected vulnerabilities. See SECURITY.md for the full policy, supported versions, and response timeline.
ABSpider Recon is licensed under the MIT License.
- 🛰️ Recon patterns inspired by the public playbooks from OWASP, the Nmap project, and the bug-bounty community.
- 🎨 UI primitives adapted from the shadcn/ui patterns, locally authored and customised.
- 🖼️ Icons by Lucide.
- 🔔 Toasts by Sonner.
- 🧰 Build tooling by Vite, React, Tailwind CSS, and TypeScript.
- 🗄️ Auth and persistence by Supabase.
- 🧪 Testing by Vitest.
- 💛 Thanks to every researcher who reports a vulnerability responsibly and to every maintainer who documents their in-scope assets clearly.
Thanks to everyone who has contributed code, payloads, modules, documentation, and bug reports.
Want to see your avatar here? Open a pull request — see 🤝 Contributing.
⬆️ Back to top · 🌐 Live demo · 📦 Repository · 🐛 Report a bug · 📄 MIT License





