5 min read

katana: Crawl a Web App for Every Endpoint (GitHub, Scanned)

ProjectDiscovery's web crawler, with a headless browser mode that finds endpoints JavaScript hides.

katana logo
✅
Scan: safe. Nothing malicious. Two things to know: the opt-in secret validation sends any credentials found to their providers, and the captcha-solving option pays an outside service to get past bot checks. Scanned Oct 28, 2026; the full report is below.

katana crawls a website and lists every URL, endpoint and parameter it can reach. Standard mode is a fast HTTP crawler that parses HTML and, with -js-crawl, JavaScript files for paths. Headless mode drives Chrome, so it also sees links that only appear after the page's scripts run, along with the XHR and fetch calls a single-page app makes. Scope rules keep it on the domain you name, filters drop duplicate-looking pages, and output can be plain URLs or JSON with forms, technologies and request details for each hit.

It is the last step of ProjectDiscovery's recon chain: subfinder finds the names, httpx keeps the live websites, and katana maps what is inside each one. That endpoint list is what you then review or test. Newer opt-in features go further: a page classifier that labels login, error and parked pages, a secrets extractor, an OpenAI-compatible model hook to guide crawl decisions, and automatic form filling.

katana is MIT-licensed and the most starred of ProjectDiscovery's recon tools here, with about 17,800 stars, 75 contributors and 23 releases. The last push was on 28 October 2026 and v1.8.0 shipped on 5 October.

Who it is for

Application security teams mapping their own web apps before a test, bug bounty hunters looking for endpoints inside an in-scope site, and developers who want a crawl of their staging site to spot forgotten pages.

Getting started

1. Install with Go (needs Go 1.26.10 or later and CGO; release binaries are also published)

CGO_ENABLED=1 go install github.com/projectdiscovery/katana/cmd/katana@latest

2. Crawl a site you are authorised to test, three levels deep, parsing JavaScript too

katana -u https://example.com -d 3 -jc

3. Or use the Docker image in headless mode

docker run projectdiscovery/katana:latest -u https://example.com -system-chrome -headless

A crawl sends many requests and, with form filling or headless mode, can submit forms and trigger actions on the site: run it only against sites you own or have permission to test, and set -rate-limit. Headless mode downloads a Chromium build unless you pass -system-chrome. Add -duc to skip the update check.

Safety scan

We cloned projectdiscovery/katana at commit e1a9ba7 on Oct 28, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.

  • No secrets, no pattern hits and no committed binaries across 234 files and about 52,000 lines, mostly Go plus JSON test data. Most hosts in the scan are test targets: security-crawl-maze.app and public-firing-range.appspot.com are Google's crawler test sites, the rest are example domains. The two run.sh scripts are CI test helpers.
  • Two opt-in flags deserve care. -kb-validate-secrets checks any API keys katana finds on a page by calling their provider, which on a site you do not own means using someone else's credentials. -captcha-solver-provider sends reCAPTCHA, hCaptcha and Turnstile challenges to the paid CapSolver service; getting past a site's bot checks can breach its terms.
  • The page classifier downloads its model from Hugging Face to ~/.dit/model.json the first time you pass -kb. Like subfinder and httpx, each run also sends ProjectDiscovery's update check (OS, architecture, version, hashed machine ID) unless you pass -duc.
  • go.mod pins 173 packages with 13 advisories, including 2 critical and 1 high. The critical ones are memory-safety bugs in the pgx PostgreSQL driver, pulled in by Praetorian's Titus secrets library, which katana uses only for the opt-in secret features; the high one is in klauspost/compress's S2 format. The rest are golang.org/x/net, goldmark and openpgp notices. All are indirect, and katana is a CLI, not a server others connect to.
  • Twelve workflows, none using pull_request_target; the 13 third-party action uses are pinned to tags, not commits. The repository has its own security policy, plus Dependabot and CodeQL.

What the scanner counted

CheckResult
SecretsNone found.
Suspicious codeNone found.
Install-time code2 installer scripts
Committed binariesNone.
CI workflows12 workflows. None use pull_request_target. 13 of 13 third-party actions pinned to a tag rather than a commit.
Network hosts40 distinct hosts referenced from source; most often security-crawl-maze.app, app.example.test, github.com, target.example. No URLs to bare IP addresses.
Known vulnerabilities13 advisories across 173 pinned packages: 2 critical, 1 high, 0 moderate, 1 low, 9 unrated. go.mod: 173 packages, 13 advisories.
Project hygieneHas security policy, automated dependency updates, CodeQL, licence file. Missing contributing guide.
OpenSSF Scorecard6.1 out of 10, as of Oct 26, 2026.

The raw findings

Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.

Installer scripts (2)
Worst known vulnerabilities (13 of 13)
AdvisorySeverityPackageSummary
GHSA-9jj7-4m8r-rfcmcriticalgithub.com/jackc/pgx/v5@5.7.2Memory-safety vulnerability in github.com/jackc/pgx/v5.
GHSA-xgrm-4fwx-7qm8criticalgithub.com/jackc/pgx/v5@5.7.2pgx contains memory-safety vulnerability
GHSA-259r-337f-4rfwhighgithub.com/klauspost/compress@1.18.5Compress/s2: Integer Overflow or Wraparound and Out-of-bounds Write in compress
GHSA-j88v-2chj-qfwxlowgithub.com/jackc/pgx/v5@5.7.2pgx: SQL Injection via placeholder confusion with dollar quoted string literals
CVE-2026-78659unknowngolang.org/x/net@0.59.0HTTP/2 server memory exhaustion due to Trailer headers in net/http
CVE-2026-78660unknowngolang.org/x/net@0.59.0HTTP/2 transport accepts malformed framing-related headers in net/http
CVE-2026-78669unknowngolang.org/x/net@0.59.0Excessive CPU consumption from repeated initial window changes in net/http
CVE-2026-78663unknowngolang.org/x/net@0.59.0Double flow control refund on HTTP/2 server streams in net/http
CVE-2026-97032unknowngolang.org/x/net@0.59.0HTTP/2 server crash due to HPACK encoder race in net/http
CVE-2026-78661unknowngolang.org/x/net@0.59.0Avoid quadratic complexity when coalescing text nodes in html in golang.org/x/net
CVE-2026-97045unknowngolang.org/x/net@0.59.0Check all ancestor namespace transitions when rendering raw text in html in golang.org/x/net
GHSA-c97m-vxhj-p7j6unknowngithub.com/yuin/goldmark@1.7.4Cross-site Scripting (XSS) in github.com/yuin/goldmark
GO-2026-5932unknowngolang.org/x/crypto@0.57.0The golang.org/x/crypto/openpgp package is unmaintained, unsafe by design, and has known security issues

By the numbers

Stars17.8K
Forks1,210
Contributors75
Commits1,909
Open issues19
Open pull requests9
Releases23
Latest releasev1.8.0
LicenceMIT
Main languageGo
Project age5 years
Last pushOct 28, 2026
Tracked files234
Lines of code52.2K
Checkout size2 MB

Lines by language: Go 29.1K, JSON 19.5K, Markdown 2,068, YAML 769, JavaScript 719, Shell 63.

Questions

Is katana free?

Yes. katana is MIT-licensed and free for any use, commercial included. Only the optional extras cost money: a captcha-solving service if you enable one, and your own model API if you point -ai-url at a paid provider.

Crawling public pages is common, but katana is far more thorough than a search engine: it can fill in forms, follow every parameter and hit the same app thousands of times. Use it on sites you own, on a client's with written permission, or within a bug bounty programme's scope and rate limits. Do not validate secrets or solve captchas on sites you are not authorised to test.

Should I use standard or headless mode?

Start with standard mode plus -jc: it is much faster and finds most links and JavaScript endpoints. Switch to -headless for single-page apps built with React, Vue or Angular, where routes and API calls only appear after the scripts run. Headless mode needs Chrome and a lot more memory.


This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.