OpenHat is a workstation catalog and playbook builder for authorized security testing.
ohqs helps you find security tools, guides, extensions, and bounty platforms, then turns a situation + written scope into a step-by-step testing playbook.
It is not an exploit generator. Playbooks focus on detection, triage, validation, and reporting.
Only use ohqs against systems you are explicitly authorized to test.
Live app: https://web-ukryty-6366.vercel.app
- Enter what you're testing
- Enter your written scope
- Confirm that you have authorization
- Click Build playbook
The app will suggest relevant tools and steps for the engagement.
git clone <this-repo>
cd quick-start
makeThen open http://127.0.0.1:8787.
That's it. make builds ohqs, installs it on your PATH, builds the local search index, and starts the UI.
Prefer the terminal?
./bin/ohqs search nuclei
./bin/ohqs recommend \
--authorized \
--scope "authorized client scope" \
--situation "vibe-coded Next.js SaaS with authentication"
./bin/ohqs show gitleaksThe catalog is stored as YAML in catalog/.
ohqs indexes that catalog locally and uses it to match a situation to relevant tools and playbooks.
catalog YAML
↓
local search index
↓
playbook matching
↓
reviewed plan
↓
commands / findings / tools
Semantic search can also be enabled with vector embeddings.
If you provide an OpenAI-compatible model, ohqs can use it to draft the plan. The authorization and scope gates still apply.
- Search the security catalog
- Build playbooks for authorized engagements
- Export a reviewed
commands.sh - Install tools required by a playbook
- Run reviewed commands locally
- Open an isolated test browser
- Use local or hosted OpenAI-compatible models
- Browse the catalog through the web UI
- Browse bounty marketplaces and programs (Bounties tab)
The Bounties tab splits bounty/VDP listings into marketplaces (HackerOne, Bugcrowd, Immunefi, …), programs (single-org: MSRC, Apple, CERTs, …), and contracts (the individual programs inside marketplaces — live, ~930+ on the Bounties tab now).
Contracts come from free sources (bounty-targets-data, bbscope) refreshed on a schedule; the LLM scope-cleaning pass runs on a contributor's GPU.
- Cadence: daily, or at least weekly.
- Powered by
runhug— deploy a good HF model on RunPod in minutes, run it for pennies, or run it locally. - Pipeline:
scripts/bounty-ingest/(scrape-all → ingest → seed-contracts → embed-edge). - Calling @chaseleto and any GPU contributor to keep the refresh going.
- Need proxies or dummy credentials per platform? Reach out to @adamsiwiec1.
Build first with make:
./bin/ohqs serveUseful commands:
# Search the catalog
./bin/ohqs search nuclei
# Inspect a catalog entry
./bin/ohqs show gitleaks
# Build an authorized playbook
./bin/ohqs recommend \
--authorized \
--scope "HackerOne program example.com, in-scope www and api" \
--situation "Next.js SaaS with auth and a chat feature" \
--target https://app.example.com
# Draft with your configured model
./bin/ohqs recommend --authorized --scope "..." --situation "..." --llm
# Check dependencies
./bin/ohqs deps --authorized --scope "..." --situation "..."
# Install tools needed by a playbook
./bin/ohqs install --authorized --scope "..." --situation "..."
# Open the isolated browser
./bin/ohqs browser| Command | Purpose |
|---|---|
serve |
Start the local UI and API |
search <query> |
Search the catalog |
show <id> |
Show a catalog record |
recommend |
Build an authorized playbook |
recommend --llm |
Draft a playbook with your model |
index |
Build the local search index |
index --semantic |
Build the index with embeddings |
index download |
Download the prebuilt vectorized index |
ingest |
Import entries from a curated source |
ingest github |
Import GitHub projects for catalog review |
models list |
Show models that fit your hardware |
models install <id> |
Install a supported local model |
models serve <id> |
Serve a local model |
deps |
Check installed dependencies |
install |
Install missing playbook tools |
browser |
Open the isolated test browser |
run |
Run a reviewed commands.sh |
setup |
Show Kali / Exegol / BlackArch setup notes |
configure |
Show local configuration |
submodules |
Opt-in fetch of upstream resources |
The local UI runs at http://127.0.0.1:8787.
From the UI you can:
- Build an authorized playbook
- Search the catalog
- Draft a plan with your own model
- Download
commands.sh - Install missing tools
- Run reviewed commands
- Open the isolated test browser
The JSON API is available from the same process:
GET /healthz
GET /v1/search?q=
GET /v1/index
GET /v1/tools/{id}
GET /v1/models
POST /v1/recommend
POST /v1/deps
GET /v1/history
The hosted edge API at https://api.openhat.io provides free access to the catalog and playbook builder.
| Endpoint | Method | Description | Rate Limit (min/hr/day) |
|---|---|---|---|
/v1/search |
GET | Search the security catalog (tools, guides, extensions, etc.) | 5 / 25 / 100 |
/v1/bounties |
GET | List bug bounty platforms/programs/contracts | 30 / 100 / 300 |
/v1/models |
GET | Get model recommendations for your hardware | 30 / 100 / 300 |
/v1/tools/{id} |
GET | Get a single catalog record by ID | 10 / 50 / 200 |
/v1/index |
GET | Check index status (records, vectors, embedder) | 30 / 100 / 300 |
/v1/recommend |
POST | Build an authorized playbook (LLM-powered via OpenRouter free tier; needs ohqs_*) |
2 / 10 / 25 |
/v1/llm/models |
GET | List available LLM models (OpenRouter free router + Workers AI) | 20 / 50 / 150 |
/v1/tokens |
POST/GET | Mint/list API tokens (Keycloak access JWT from portal) | — |
/v1/auth/verify |
GET | Verify Keycloak JWT or ohqs_* API token |
— |
/healthz |
GET | Health check | — |
All endpoints are strictly rate limited per IP and per authenticated user (the stricter of the two applies) across three time windows:
- Catalog search (
/v1/search): 5/min, 25/hr, 100/day - Playbook creation (
/v1/recommend): 2/min, 10/hr, 25/day - Tool details (
/v1/tools/{id}): 10/min, 50/hr, 200/day - Other endpoints have higher limits (see table)
Rate limit headers are included in responses:
X-RateLimit-Limit— max requests in minute windowX-RateLimit-Limit-Hour— max requests in hour windowX-RateLimit-Limit-Day— max requests in day windowX-RateLimit-Remaining— requests left in the strictest windowX-RateLimit-Reset— Unix ms when the strictest window resetsRetry-After— seconds until next request allowed (on 429)
On 429 responses, the JSON body includes "window": "minute|hour|day" indicating which limit was exceeded.
OHQS web has no login. Mint an opaque client API token in openhat-portal
(/dashboard/tokens), then call the API with Authorization: Bearer ohqs_c_….
Client tokens are metered by token_id + IP; hashes only are stored at rest.
See docs/auth-keycloak.md.
curl -H "Authorization: Bearer <CLIENT_API_TOKEN>" https://api.openhat.io/v1/search?q=nucleiAdmin AI tokens exist for ops embed/LLM work only — mint in the portal admin Tokens section. Never put them in README examples, CLI defaults, or www.
- Sign in to openhat-portal (local
:3210) and open API tokens. - Mint a client token (shown once) and export it:
export OHQS_API_TOKEN=ohqs_c_… # client token only — never an ai_admin token
export OHQS_API=http://127.0.0.1:8788 # local worker
curl -H "Authorization: Bearer $OHQS_API_TOKEN" "$OHQS_API/v1/search?q=nuclei"
# or: ohqs configure --save --api-token "$OHQS_API_TOKEN"Full local Keycloak + portal setup: docs/auth-keycloak.md.
Search the catalog:
curl "https://api.openhat.io/v1/search?q=nuclei&limit=10"Build a playbook (requires --authorized gate):
curl -X POST https://api.openhat.io/v1/recommend \
-H "Content-Type: application/json" \
-d '{
"authorized": true,
"scope": "example.com, in-scope www and api",
"situation": "Next.js SaaS with auth and a chat feature"
}'Get model recommendations for your hardware:
curl "https://api.openhat.io/v1/models?ramgb=16&vramgb=0&limit=6"List available LLM models (OpenRouter free router):
curl "https://api.openhat.io/v1/llm/models"The /v1/recommend LLM planner uses OpenRouter's free router (inclusionai/ling-3.0-flash-fin:free) by default. No API key required for the free tier.
To use a different model, pass model in the request body (must match an available OpenRouter model):
curl -X POST https://api.openhat.io/v1/recommend \
-H "Content-Type: application/json" \
-d '{
"authorized": true,
"scope": "...",
"situation": "...",
"model": "openrouter/auto"
}'ohqs can use any OpenAI-compatible endpoint.
Your model is responsible for drafting the plan; ohqs provides the catalog, authorization gate, scope, and execution workflow.
For a local server:
./bin/ohqs configure --save \
--openai-base-url http://127.0.0.1:8000/v1 \
--openai-api-key sk-localThen:
./bin/ohqs recommend --authorized --scope "..." --situation "..." --llmEnvironment variables work too:
export OHQS_OPENAI_BASE_URL=http://127.0.0.1:8000/v1
export OHQS_OPENAI_API_KEY=sk-local
export OHQS_OPENAI_MODEL=your-modelConfiguration is stored locally in data/config.json, which is gitignored.
The model is prompted for an authorized security-testing plan, not exploit payloads. If the model response cannot be parsed, ohqs falls back to its deterministic template playbook.
The catalog contains:
- Security tools
- Browser extensions
- Guides and cheat sheets
- Reference documentation
- Operating systems
- Bug bounty platforms
- Scan indexes and other security resources
The YAML records in catalog/ are the source of truth.
The catalog inventory is documented in REFERENCES.md.
Search it with:
./bin/ohqs search <query>or use the search box in the web UI.
The repository can optionally include upstream security-tool repositories under third-party-resources/.
They are not cloned by default.
A normal clone is enough to use the catalog and ohqs:
git clone <this-repo>To fetch upstream resources later:
make submodulesOr fetch a specific catalog entry:
./bin/ohqs submodules gitleaksDo not use --recurse-submodules unless you intentionally want to download the upstream trees.
See third-party-resources/README.md for details.
You can import additional resources into a review file before adding them to the index.
Curated sources:
./bin/ohqs ingest --from awesome-web-securityGitHub:
./bin/ohqs ingest github --topics c2,reconnaissanceImported records are written to catalog/ingested.yaml.
They are de-duplicated and tagged for review before indexing.
Run ./bin/ohqs ingest --help for all available options.
EXAMPLES.md— worked examplesCONTRIBUTING.md— adding catalog recordsREFERENCES.md— catalog inventorythird-party-resources/README.md— upstream resources
Hosted edge API + static UI deploy from GitHub Actions on push to main when deploy/worker or deploy/web change. Setup: deploy/worker/README.md.
ohqs/ Go application
catalog/ YAML catalog
deploy/worker/ Cloudflare Worker (API + web assets)
deploy/web/ Static console served by the Worker
third-party-resources/ Optional upstream repositories
REFERENCES.md Catalog inventory
docs/ Additional documentation
First-party ohqs code, catalog data, scripts, documentation, and the frontend are GPLv3.
Upstream projects under third-party-resources/ retain their own licenses. This repository does not relicense projects such as Metasploit, Wireshark, or SecLists.
See LICENSE and NOTICE.