crawlx

Security research use only

Next-generation AI/LLM-native crawler for authorized security research.

crawlx maps the attack surface of dynamic web applications you are authorized to test. LLM-guided planning and an accessibility-tree browser plane find the pages, forms and endpoints; an independent safety kernel decides what is allowed to run.

Pinned toolchain · builds from source
git clone https://github.com/noxred-research/crawlx.git
cd crawlx
cargo build --release -p crawlx-cli

Capabilities

  • Accessibility tree
  • Enablement graph
  • State clustering
  • Form discovery
  • Endpoint mining
  • Secret detection
  • Scope + robots
  • Safety kernel
  • Authorization records
  • Audit journal
  • Zero data retention
  • Encrypted custody
  • LLM planner
  • ONNX ranker
  • MCP server
  • Firecrawl-compatible API
crawlx crawlFixture · static
$ crawlx crawl http://127.0.0.1:34635/s1/ \
    --mode static --seed 20261019 \
    --allow-private-networks \
    --authorization-record authz.local.json

discovered      90
admitted        30
deduplicated    55
policy_blocked   3
robots_blocked   2
succeeded       28
failed           2
Summary of a run against the bundled local fixture. Private-network access needs an authorization record.

Pre-1.0 source release. Production qualification is in progress — do not expose a checkout as a public service.

01AI/LLM-native

Models propose. The kernel decides.

Language models and learned rankers help crawlx explore single-page applications. They rank candidate actions; they never authorize one. Model confidence is not safety confidence, and nothing in the model layer can approve an action.

LLM-guided planning

An optional planner proposes a short plan in a closed vocabulary: at most 20 steps, candidate indexes and value references only — no selectors, no URLs. Page text reaches a prompt only as tagged untrusted data, and the safety kernel still adjudicates every step.

Typed-decision service and ONNX ranker

Calibrated probabilities over a crawler-built candidate list, from an external typed-decision service or an optional ONNX ranker. A confidence gate abstains when unsure; a circuit breaker stops a failing engine.

Accessibility-tree understanding

Dynamic apps are read through the accessibility tree, with versioned element identity, reversible state clustering and a learned enablement graph.

LLM-ready output

Pages become Markdown with metadata and links. Opt-in word-window chunk ranges are available on the scrape API for downstream LLM pipelines.

MCP server for agent tooling

crawlx mcp serves the Firecrawl MCP tools over stdio, as a thin client of a crawlx API.

LLM extract and agent endpoints

The Firecrawl-compatible API at /compat/firecrawl/v2 serves extract and agent, for tool interoperability. They need an OpenAI-compatible backend you configure; without one the endpoint answers 503.

02Security research

Discover the attack surface of a dynamic app.

Most crawlers stop at HTTP, and most browser automation clicks anything. crawlx observes what an application exposes, in read-only mode by default, and records what it did.

Attack-surface discovery

A URL plane for documents and a pinned-Chromium browser plane for script-heavy apps, in one run. Observe-only mode records states and accessibility-tree snapshots without interacting.

Form and endpoint discovery

Form extraction, JavaScript endpoint mining (off|regex|ast|both), sitemaps, feeds and known files, with seeded, reproducible form input.

Secret detection

--detect-secrets flags exposed credentials in crawled content. Secrets are redacted from logs, traffic metadata and exports.

03Controls

Authorized use, enforced in code.

Defaults refuse. Capabilities widen only through an explicit, recorded grant, and a kernel independent of the crawl logic enforces it.

Read the safety model ↗

Scope and robots enforcement

Scope by host, registrable domain or domain, robots.txt per RFC 9309, politeness limits per origin, and a deny-first egress policy that refuses loopback, private, link-local and cloud-metadata addresses on every redirect hop and browser request.

Hard safety kernel

Every fetch and browser action is classified. The default read_only profile cannot change server state; test_environment and authorized_security_test widen it only with an authorization record.

Authorization records

Private-network access, elevated profiles and the robots override need an operator-created record stating what you are authorized to do, with a create, verify, revoke and offline-sign lifecycle.

Audit journal

Every action is journaled before it is performed and every safety verdict is recorded. An independent auditor checks the record from outside the worker and pauses violating runs.

Zero data retention

ZDR mode never creates a durable response cache. Payloads sit in a volatile buffer with a fixed lifetime.

Encrypted custody of sensitive findings

Retained content and sensitive artifacts are sealed under per-artifact data keys, wrapped by AWS KMS or an operator key file, and published only after a recheck against the run-wide secret registry.

04Security research use only

Responsible use.

crawlx exists for authorized security research and testing. You are responsible for how you use it.

Do

  • Test only systems you own or are explicitly authorized to test.
  • Write down the scope in an authorization record before a privileged run.
  • Keep the default profile and robots enforcement unless your authorization says otherwise.
  • Report vulnerabilities you find to the owner, privately.

Do not

  • Crawl or scrape systems without authorization.
  • Use it for credential attacks or any form of abuse.
  • Point it at third-party infrastructure you do not control.
  • Run a checkout as a public service while it is pre-1.0.

05Architecture

Small crates, strict layers.

A 21-crate Rust workspace with enforced dependency layering. The model layer cannot depend on the safety kernel, so it cannot authorize anything.

Interfaces

  • crawlx CLI
  • REST + SSE API
  • Firecrawl-compatible API
  • MCP over stdio

Guidance (advisory)

  • LLM planner
  • Typed-decision service
  • ONNX ranker

Safety kernel admits every fetch and every browser action

URL plane

  • Scope + robots
  • Bounded fetch
  • Extraction

Browser plane

  • Pinned Chromium
  • Accessibility tree
  • State graph

Storage and audit

  • PostgreSQL
  • Action journal
  • Sealed artifacts
  • Volatile secret custody

Read the architecture document ↗ for details.

06Quick start

From clone to first authorized crawl.

You need the pinned Rust toolchain. Dynamic and hybrid crawls also need the pinned Chrome for Testing build; the helper script downloads it and verifies its SHA-256. Use a target you are authorized to test.

  1. Step 1 · Build

    git clone https://github.com/noxred-research/crawlx.git
    cd crawlx
    cargo build --release -p crawlx-cli
  2. Step 2 · Observe a web application

    export CRAWLX_CHROMIUM_PATH=$(ci/fetch-chromium.sh)
    crawlx crawl https://app.example.org \
      --mode dynamic --observe-only --output ./out
  3. Step 3 · Add secret and form discovery

    crawlx crawl https://app.example.org --mode hybrid \
      --detect-secrets --form-extraction \
      --javascript-mode both --output ./out

07Tool interoperability

Firecrawl-compatible API and MCP.

The /compat/firecrawl/v2 facade accepts fc- keys, so Firecrawl SDKs, its CLI, LangChain’s loader and MCP clients can drive a crawlx you operate. The integration notes list base URLs per client and what does not work.

Integration notes ↗

crawlx serve --firecrawl-keys \
  --api-key acme=fc-<32 hex>
crawlx mcp --api-url http://127.0.0.1:8080

08Open source

License and vulnerability reports.

AGPL-3.0-only

crawlx is licensed under the GNU Affero General Public License, version 3 only — not “version 3 or later.” Third-party dependencies, vendored sources and embedded resources keep their own licenses and notices.

Source on GitHub ↗

Report a vulnerability in crawlx

Use GitHub private vulnerability reporting. Please do not open public issues for suspected vulnerabilities, and do not include live credentials or real personal data in a report.

Report privately ↗ · security.txt