This tutorial will walk you through your first ExploitHunter.app research session from start to finish. You'll set up the app, create a project, authorize a target, and run a basic recon session against the bundled Hard Juice Shop lab.
ExploitHunter has two supported ways to run:
- Packaged desktop app: install or build the Electron package for a normal app window. It starts the same local service for you.
- Local service: run the service yourself and open
http://localhost:3210in your OS browser. This is the default path below and the clearest mode for development.
- Node.js >= 24.0.0
- pnpm 10.34.3 via Corepack
- Docker and Docker Compose (v2), only for bundled labs and containerized tooling
- Either Ollama installed locally or an OpenRouter API key (dashboard)
# Clone and enter the repo
git clone https://github.com/justsml/ExploitHunter.app.git
cd ExploitHunter.app
# Use the pinned package manager
corepack enable
corepack prepare pnpm@10.34.3 --activate
# Install dependencies
pnpm install
# Configure environment
cp .env.example .envOpen .env and review the local defaults:
# Everything persistent lives here by default.
EXPLOIT_HUNTER_DATA_DIR=.data
SQLITE_DATABASE_URL=sqlite://.data/exploit-hunter.sqlite
MASTRA_DATABASE_URL=sqlite://.data/mastra.sqlite
LANCEDB_URI=.data/lancedb
OBJECT_STORAGE_MODE=filesystem
# Optional: leave blank to use the local Ollama fallback when available.
OPENROUTER_API_KEY=
# Or use OpenRouter:
# OPENROUTER_API_KEY=sk-or-v1-your-key-here
MODEL_DEFAULT=llm://openrouter/deepseek/deepseek-v4-flashStart the bundled lab if you want the tutorial target, then start the app:
# Optional lab target
docker compose up -d hard-juice-shop
# Seed demo data (optional, gives you a sample project)
pnpm db:seed
# Start the app
pnpm devOpen http://localhost:3210. If you are using a packaged Electron build instead, open the app; it launches this local service behind the desktop window.
To inspect agents, tools, memory, and traces in Mastra Studio, start it in a second terminal:
pnpm studioOpen http://localhost:4111.
Studio uses a separate .data/mastra-studio-observability.duckdb file by default,
allowing it to run beside the app without a DuckDB file-lock conflict. Override it
independently with MASTRA_STUDIO_DUCKDB_PATH when needed.
- You should see the Create Project screen (or an empty project list)
- Click New Project and name it something like "Hard Juice Shop Recon"
- Enter a description: "First pass at the bundled Hard Juice Shop"
- Click Create
You now have a durable project with Mastra memory, artifact storage, and a dedicated lab workspace.
Before Hunter can touch anything, you need to declare and authorize the target:
- In the project chat, send:
I want to authorize the target http://127.0.0.1:3323 for testing - Hunter should respond with a target authorization request surface
- Review the target details and click Approve
The target is now authorized for the project. This is deliberate: scope should live in the app's authorization ledger, not in a temporary prompt or environment variable.
Now that your target is authorized, start exploring:
Let's run a baseline HTTP probe against the Hard Juice Shop lab
Hunter will:
- Create a research plan with tasks
- Run an HTTP probe against the target
- Save the probe output as an artifact
- Index the evidence into the project's RAG memory
You'll see the plan panel update with task progress. When the probe completes, the findings surface will show what was discovered.
- Click the Evidence tab in the right panel
- Browse the HTTP probe artifact — it includes the raw request/response
- Hunter may suggest next steps based on what they found
Try these prompts to explore more features:
Create a system map of the target's endpointsCheck for missing security headersRun a deeper probe on the login endpointWalk me through the attack surface
- Check the ExploitHunter roadmap for current priorities
- Read docs/architecture.md for the full system design
| Problem | Likely Cause | Fix |
|---|---|---|
| No projects or artifacts after moving machines | .data was not copied |
Copy the whole .data directory or restore a tar/zip backup of it |
| Agent won't run probes | Target not authorized or active action not approved | Authorize the target in chat and approve the specific probe/action when asked |
| "Model not available" errors | Ollama model not pulled, Ollama missing, or OpenRouter quota exhausted | Run pnpm ollama:gemma4, verify Ollama is installed, or check OPENROUTER_API_KEY billing |
pnpm dev fails on startup |
Missing .env or wrong Node version |
cp .env.example .env, check node --version (must be >= 24.0) |
| Hard Juice Shop not loading | Container not started | docker ps | grep juice-shop should show the lab container on port 3323 |
| Recall quality changed after switching embeddings | Existing vectors were built with another embedding identity | Check .data/lancedb/thread-rag-indexes.json; re-index disk artifacts when prompted |