Modern Web Guidance
JetBrains/skills
Search tool for modern web development best practices. An agent skill from JetBrains/skills.
Discover a single-page-app's hidden backend API from its public JS bundle, then test that API for broken access control / missing authentication.
$ npx skills add elementalsouls/Claude-BugHunter --skill hunt-spa-api -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install elementalsouls/Claude-BugHunter hunt-spa-api --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/elementalsouls/Claude-BugHunter.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/hunt-spa-api .claude/skills/hunt-spa-api && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "hunt-spa-api" agent skill from https://github.com/elementalsouls/Claude-BugHunter/tree/main/skills/hunt-spa-api into .claude/skills/hunt-spa-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hunt-spa-api", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/elementalsouls/Claude-BugHunter/tree/main/skills/hunt-spa-apiType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add elementalsouls/Claude-BugHunter --skill hunt-spa-api -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install elementalsouls/Claude-BugHunter hunt-spa-api --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elementalsouls/Claude-BugHunter.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/hunt-spa-api .agents/skills/hunt-spa-api && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "hunt-spa-api" agent skill from https://github.com/elementalsouls/Claude-BugHunter/tree/main/skills/hunt-spa-api into .agents/skills/hunt-spa-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hunt-spa-api", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add elementalsouls/Claude-BugHunter --skill hunt-spa-api -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install elementalsouls/Claude-BugHunter hunt-spa-api --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elementalsouls/Claude-BugHunter.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/hunt-spa-api .cursor/skills/hunt-spa-api && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "hunt-spa-api" agent skill from https://github.com/elementalsouls/Claude-BugHunter/tree/main/skills/hunt-spa-api into .cursor/skills/hunt-spa-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hunt-spa-api", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/elementalsouls/Claude-BugHunter.git --path skills/hunt-spa-api--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add elementalsouls/Claude-BugHunter --skill hunt-spa-api -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install elementalsouls/Claude-BugHunter hunt-spa-api --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elementalsouls/Claude-BugHunter.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/hunt-spa-api .gemini/skills/hunt-spa-api && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "hunt-spa-api" agent skill from https://github.com/elementalsouls/Claude-BugHunter/tree/main/skills/hunt-spa-api into .gemini/skills/hunt-spa-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hunt-spa-api", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install elementalsouls/Claude-BugHunter hunt-spa-apiInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add elementalsouls/Claude-BugHunter --skill hunt-spa-api -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/elementalsouls/Claude-BugHunter.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/hunt-spa-api .github/skills/hunt-spa-api && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "hunt-spa-api" agent skill from https://github.com/elementalsouls/Claude-BugHunter/tree/main/skills/hunt-spa-api into .github/skills/hunt-spa-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hunt-spa-api", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add elementalsouls/Claude-BugHunter --skill hunt-spa-api -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install elementalsouls/Claude-BugHunter hunt-spa-api --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elementalsouls/Claude-BugHunter.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/hunt-spa-api .opencode/skills/hunt-spa-api && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "hunt-spa-api" agent skill from https://github.com/elementalsouls/Claude-BugHunter/tree/main/skills/hunt-spa-api into .opencode/skills/hunt-spa-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hunt-spa-api", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
hunt-spa-apiDiscover a single-page-app's hidden backend API from its public JS bundle, then test that API for broken access control / missing authentication.
Hunt Spa API is an agent skill from elementalsouls/Claude-BugHunter. Discover a single-page-app's hidden backend API from its public JS bundle, then test that API for broken access control / missing authentication. One of the highest-yield web plays in modern recon — SPAs ship their entire backend route map to the browser, and the API behind them is frequently missing the auth middleware the login page implies. Built from an authorized engagement where this play found an unauthenticated financial API that an ASM scan reporting hundreds of "Criticals" completely missed. Use…
Its SKILL.md is about 2.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Backend & APIs, covering Authorization and RBAC and Authentication. It works with Angular, React, Vue.js and Git. The repository describes itself as: A Claude Code skill bundle for bug hunting and external red-team work - 82 skills, 15 slash commands, 681 disclosed-report patterns curated across 24 core vulnerability classes… The licence is MIT.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit b0957e6. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
curlFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use curl, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Hunt Spa API loads about 2.2k tokens when it runs. Until then it costs about 243 tokens; SKILL.md has 804 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
n. Leaked build artifacts (source maps / .env / .git / asset-manifest) are owned by hunt-source-leak; API version-inventAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from elementalsouls/Claude-BugHunter at commit b0957e6, republished under its MIT licence (© elementalsouls). 804 words, ~2,233 tokens.
.claude/skills/hunt-spa-api/SKILL.md (or your agent's skills folder).Trigger when:
/static/js/*.js or /_next/static/* bundles (React/Vue/Angular/Next/Svelte SPA)console, app, dashboard, portal, admin, panel, manage, internal*api*, *-api*, api.* hostThe core insight: a SPA is a client to a backend API, and it ships the full map of that API — hosts, routes, sometimes keys — to anyone who views source. The login page being protected says nothing about whether the API behind it checks tokens. Auth is frequently enforced on the gateway/login and missing on a route group of the API.
DO NOT skip this because "the app needs login" — that's exactly when this pays off.
curl -s https://console.target.com/ -o index.html
# React/CRA:
grep -oE '/static/js/[^"]+\.js' index.html
# Next.js:
grep -oE '/_next/static/[^"]+\.js' index.html
# generic:
grep -oiE 'src="[^"]+\.js[^"]*"' index.htmlDownload every bundle (they can be multi-MB — that's fine, it's all route data):
mkdir bundles
for j in $(grep -oE '/static/js/[^"]+\.js' index.html | sort -u); do
curl -s "https://console.target.com$j" -o "bundles/$(echo "$j"|tr '/' '_')"
doneB=bundles/*.js
# Backend API hosts (incl. dev/beta/staging variants — often weaker auth)
grep -ohiE 'https://[a-z0-9.-]*(api|console|backend|service)[a-z0-9.-]*\.target\.com[a-z0-9/_-]*' $B | sort -u
# Versioned API base paths
grep -ohiE '/api/v[0-9]+/?' $B | sort -u
# Route literals — minified bundles store routes as STRING segments, not full URLs.
# Grep for quoted "resource/action" strings:
grep -ohiE '"[a-z0-9_-]+/[a-z0-9_/-]+"' $B | tr -d '"' \
| grep -iE '(login|user|account|order|billing|invoice|payment|deal|report|token|otp|password|reset|admin|profile|auth|upload|export|role|permission|dashboard|wallet|finance|sales)' | sort -u
# Secrets (validate before trusting — most AIza keys are Maps/analytics, not Auth)
grep -ohiE '(AIza[0-9A-Za-z_-]{35}|AKIA[0-9A-Z]{16}|sk_live_[0-9A-Za-z]+|eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}|apiKey["'"'"']?\s*[:=]\s*["'"'"'][^"'"'"']+)' $B | sort -uNote: minifiers store routes as concatenated string segments (e.g. "account/payment/list"), NOT full /api/v2/... URLs — so a naive /api/v* grep returns nothing. Grep for the resource-word route strings and prepend the base yourself.
Lazy-loaded (async) chunks — don't stop at HTML-referenced bundles. CRA/webpack SPAs reference only runtime+main+vendor in index.html; numbered async route chunks are named inside main.js's chunk map and loaded at runtime, so grepping only /static/js/*.js from the shell truncates route coverage to eager chunks.
grep -oE '[0-9]+:"[a-f0-9]+"' bundles/*main*.js # {chunkId:"hash"} pairs
# reconstruct /static/js/<id>.<hash>.chunk.js, download each, re-run route/host/secret harvest
# asset-manifest.json (if present) lists them all -> hunt-source-leakBefore declaring anything vulnerable, send an unauthenticated request to an endpoint you expect to be protected, and capture what correct rejection looks like:
curl -s -X POST https://api.target.com/api/users -H 'Content-Type: application/json' -d '{}'
# secure → {"error":"Missing or invalid authorization header"} or HTTP 401This is your differential. A sibling API (e.g. a second API host, or a different route group on the same host) is the ideal control — same stack, so a different response = real authz gap, not a quirk.
For every discovered route, send it with no Authorization header and compare to the control:
for r in <routes>; do
curl -s -o /tmp/r -w "[%{http_code}] $r\n" -X POST -H 'Content-Type: application/json' -d '{}' "https://api.target.com/api/v2/$r"
doneInterpret:
401/"Missing authorization" → gated (correct). Move on.200 with data → unauthenticated data exposure. Finding.400 "field X is mandatory" → the route processed your request and reached business-logic validation without an auth check → auth bypass; supply the field minimally to confirm.200 + verbose DB/stack error (e.g. PROCEDURE db_x.sp_y does not exist) → reached the data layer unauthenticated; also a SQLi-surface signal.is_admin / is_internal / requested_by / role_id / account_type → authorization derived from client-supplied parameters — set the privilege flag and you self-elevate. Critical-class.account_id, order_id, deal_id) are the keys the other endpoints consume — they prove the whole router is reachable, not just one route.dev-/beta-/staging- API variants — they frequently have weaker/disabled auth.Access-Control-Allow-Origin: * compounds the issue (any web origin reads it from a victim's browser).totalCount) confirms the missing check. Do NOT enumerate the table — see redteam-mindset data-minimization boundary. The finding is the absent auth, not the data volume.A common, dangerous architecture:
console.target.com (the SPA) → login is Entra/Okta/Google OAuth (looks airtight).api.target.com (the backend) → some route groups enforce the bearer token, some route groups forgot the middleware.The frontend login is theatre if the API doesn't independently validate the token on every route. Always test the API directly, bare, regardless of how locked-down the login UI is.
/api/v1/foo returned 404, so no API here." Wrong base or wrong method. Try /api/, /api/v2/, POST not GET, and the exact route strings from the bundle (Express's 404 echoes the path — use it to calibrate).CONFIGURATION_NOT_FOUND on identitytoolkit = not Auth-enabled). Don't over-claim.redteam-mindset.)create/signup/upload to "demonstrate" — that's a destructive write needing explicit per-action authorization.hunt-api-misconfig — once the API is mapped, run the broader misconfig matrix (method tampering, mass assignment, JWT alg confusion) per route.hunt-idor — the account_id/order_id pivots feed straight into IDOR testing across discovered routes.hunt-source-leak — sourcemaps (*.js.map) reconstruct original source for deeper route/secret extraction; same harvesting muscle.hunt-nextjs — for Next.js targets, layer the middleware-bypass (x-middleware-subrequest) and /_next/data route tests on top of this.redteam-mindset — the data-minimization boundary governs step 5: prove the missing check, don't exfiltrate the table.recon-scope-triage — verify the API host actually belongs to the target before testing (don't pop a same-named third party's API).© elementalsouls, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/hunt-spa-api of elementalsouls/Claude-BugHunter.
Open the folder on GitHubat commit b0957e6
Hunt Spa API next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Hunt Spa API this skillelementalsouls/Claude-BugHunter | 4.8k | — | ~2.2k | Automated safety check: Notes | MIT | |
| Modern Web GuidanceJetBrains/skills | 363 | 3 repos | ~1.4k | Automated safety check: Pass | Apache-2.0 | |
| Passport Developmenttrypostit/trypost | 676 | — | ~1.9k | Automated safety check: Pass | MIT | |
| Experience UI Bundle Features Generateforcedotcom/sf-skills | 1.1k | — | ~2.9k | Automated safety check: Pass | Apache-2.0 | |
| Auth Access Controlzhaji2333/CkSKILLS | 112 | — | ~1.3k | Automated safety check: Pass | MIT | |
| Olore Tanstack Query 4olorehq/olore | 103 | — | ~583 | Automated safety check: Pass | MIT |
JetBrains/skills
Search tool for modern web development best practices. An agent skill from JetBrains/skills.
trypostit/trypost
Develops OAuth2 API authentication with Laravel Passport. An agent skill from trypostit/trypost.
forcedotcom/sf-skills
MUST activate when the project contains a uiBundles//src/ directory (React or Angular) and the user wants to add a pre-built feature — such as authentication (login, logout, protected routes…
zhaji2333/CkSKILLS
当出现注册/登录/找回密码/验证码/绑定手机/实名认证/OAuth/SSO/2FA/JWT等认证功能,前后端分离应用出现路由守卫/前端鉴权绕过,或发现ID可替换、角色参数可控、租户ID可控、接口存在越权迹象时调用。负责认证绕过、前端鉴权绕过、会话安全、验证码安全、水平/垂直越权、多租户隔离、密码重置、加密与随机性弱点分析。
olorehq/olore
Local TanStack Query documentation reference (v4). An agent skill from olorehq/olore.
anolilab/lunora
Wires Lunora's live data into a client. An agent skill from anolilab/lunora.
elementalsouls/Claude-BugHunter
Hunt API security misconfiguration — mass assignment, prototype pollution, HTTP verb tampering.
elementalsouls/Claude-BugHunter
Hunt account takeover taxonomy — 9 distinct paths to ATO, plus chains.
elementalsouls/Claude-BugHunter
Hunt fintech-specific GraphQL vulnerabilities: money-movement mutations (transfers, redemptions, withdrawals, card top-ups), ledger/balance/portfolio query IDOR, decimal-precision and rounding…
elementalsouls/Claude-BugHunter
Hunt HTTP request smuggling (CL.TE, TE.CL, H2.CL, H2.TE). An agent skill from elementalsouls/Claude-BugHunter.
elementalsouls/Claude-BugHunter
Hunt JWT cryptographic failures — alg:none signature-stripping and RS256→HS256 key-confusion that let an attacker forge a token for any identity (e.g.
elementalsouls/Claude-BugHunter
Hunt vector-store / embedding-layer weaknesses in RAG pipelines (OWASP LLM08 Vector and Embedding Weaknesses) — persistent corpus poisoning that survives across sessions and users (distinct from…
Categories
Discover a single-page-app's hidden backend API from its public JS bundle, then test that API for broken access control / missing authentication. Hunt Spa API is an agent skill from elementalsouls/Claude-BugHunter. Discover a single-page-app's hidden backend API from its public JS bundle, then test that API for broken access control / missing authentication.
Hunt Spa API fits situations like: A target serves a JS-heavy SPA (React/Vue/Angular/Next); an app/console/dashboard/portal subdomain; any api host shows up in recon.
Run `npx skills add elementalsouls/Claude-BugHunter --skill hunt-spa-api -a claude-code`. Or copy the skill folder (skills/hunt-spa-api in elementalsouls/Claude-BugHunter) into .claude/skills/hunt-spa-api in your project. Claude Code loads it when a task matches its description.
Run `npx skills add elementalsouls/Claude-BugHunter --skill hunt-spa-api -a codex`. Or copy the skill folder (skills/hunt-spa-api in elementalsouls/Claude-BugHunter) into .agents/skills/hunt-spa-api in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add elementalsouls/Claude-BugHunter --skill hunt-spa-api -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/hunt-spa-api, .gemini/skills/hunt-spa-api, .github/skills/hunt-spa-api and .opencode/skills/hunt-spa-api in your project.
Going by SKILL.md and its folder, Hunt Spa API needs the command-line tools its instructions call (curl).
SKILL.md contains no URLs. Its commands use curl, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Hunt Spa API is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.2k tokens (SKILL.md is roughly 8.9k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Hunt Spa API: Modern Web Guidance (JetBrains/skills, 363 stars), Passport Development (trypostit/trypost, 676 stars), Experience UI Bundle Features Generate (forcedotcom/sf-skills, 1.1k stars) and Auth Access Control (zhaji2333/CkSKILLS, 112 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
elementalsouls (a GitHub user) maintains it in elementalsouls/Claude-BugHunter, which has 4,783 GitHub stars. The repository holds 17 skills in this directory. The repository was last updated on October 6, 2026.
Source: elementalsouls/Claude-BugHunter on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.