[package]
edition = "2024"
rust-version = "1.91"
name = "crawlberg"
version = "1.0.5"
authors = ["Na'aman Hirschfeld <naaman@xberg.io>"]
build = false
autolib = false
autobins = false
autoexamples = false
autotests = false
autobenches = false
description = "High-performance web crawling engine"
homepage = "https://xberg.io"
documentation = "https://docs.rs/crawlberg"
readme = "README.md"
keywords = [
"crawl",
"scrape",
"web",
"spider",
"rust",
]
categories = [
"web-programming",
"network-programming",
]
license = "MIT"
repository = "https://github.com/xberg-io/crawlberg"
resolver = "2"
[package.metadata.cargo-machete]
ignored = [
"base64",
"getrandom",
"getrandom03",
"memchr",
]
[features]
ai = [
"dep:liter-llm",
"dep:minijinja",
]
api = [
"dep:axum",
"dep:tower-http",
"dep:utoipa",
"dep:uuid",
"dep:base64",
"native-runtime",
]
browser = ["browser-chromiumoxide"]
browser-chromiumoxide = [
"dep:chromiumoxide",
"dep:dirs",
"native-runtime",
]
browser-native = [
"dep:crawlberg-browser",
"native-runtime",
]
default = ["native-runtime"]
full = [
"browser",
"browser-native",
"ai",
"telemetry-init",
"interact",
"mcp",
"api",
"mcp-http",
"warc",
]
interact = ["browser"]
mcp = [
"dep:rmcp",
"dep:schemars",
]
mcp-http = [
"mcp",
"api",
]
native-runtime = []
telemetry-init = [
"dep:opentelemetry-otlp",
"dep:opentelemetry_sdk",
"dep:tracing-opentelemetry",
"dep:tracing-subscriber",
]
warc = ["dep:uuid"]
[lib]
name = "crawlberg"
path = "src/lib.rs"
[[example]]
name = "custom_builder"
path = "examples/custom_builder.rs"
[[test]]
name = "engine_error_escalation"
path = "tests/engine_error_escalation.rs"
[[test]]
name = "proxy_provider_integration"
path = "tests/proxy_provider_integration.rs"
[[test]]
name = "ssrf_integration"
path = "tests/ssrf_integration.rs"
[[test]]
name = "substrate_only_crawl"
path = "tests/substrate_only_crawl.rs"
[[test]]
name = "test_antibot_strategy"
path = "tests/test_antibot_strategy.rs"
[[test]]
name = "test_async_borrow"
path = "tests/test_async_borrow.rs"
[[test]]
name = "test_batch_crawl_integration"
path = "tests/test_batch_crawl_integration.rs"
[[test]]
name = "test_browser_mode_stealth"
path = "tests/test_browser_mode_stealth.rs"
[[test]]
name = "test_browser_native"
path = "tests/test_browser_native.rs"
[[test]]
name = "test_bypass_provider"
path = "tests/test_bypass_provider.rs"
[[test]]
name = "test_dispatch_robustness"
path = "tests/test_dispatch_robustness.rs"
[[test]]
name = "test_dispatch_types"
path = "tests/test_dispatch_types.rs"
[[test]]
name = "test_document_download"
path = "tests/test_document_download.rs"
[[test]]
name = "test_escalation"
path = "tests/test_escalation.rs"
[[test]]
name = "test_follow_document_urls"
path = "tests/test_follow_document_urls.rs"
[[test]]
name = "test_frontier_dedup"
path = "tests/test_frontier_dedup.rs"
[[test]]
name = "test_interact"
path = "tests/test_interact.rs"
[[test]]
name = "test_markdown_integration"
path = "tests/test_markdown_integration.rs"
[[test]]
name = "test_mcp_contract"
path = "tests/test_mcp_contract.rs"
[[test]]
name = "test_mcp_http"
path = "tests/test_mcp_http.rs"
[[test]]
name = "test_middleware_integration"
path = "tests/test_middleware_integration.rs"
[[test]]
name = "test_pool_reuse"
path = "tests/test_pool_reuse.rs"
required-features = ["browser"]
[[test]]
name = "test_proptest_invariants"
path = "tests/test_proptest_invariants.rs"
[[test]]
name = "test_scrape_redirects"
path = "tests/test_scrape_redirects.rs"
[[test]]
name = "test_soft_http_errors"
path = "tests/test_soft_http_errors.rs"
[[test]]
name = "test_stream_seed_error"
path = "tests/test_stream_seed_error.rs"
[[test]]
name = "test_streaming_memory_bounded"
path = "tests/test_streaming_memory_bounded.rs"
[[test]]
name = "test_waf_detection_integration"
path = "tests/test_waf_detection_integration.rs"
[[test]]
name = "test_waf_fixtures"
path = "tests/test_waf_fixtures.rs"
[[test]]
name = "test_waf_hot_reload"
path = "tests/test_waf_hot_reload.rs"
[[test]]
name = "test_waf_robustness"
path = "tests/test_waf_robustness.rs"
[[bench]]
name = "citations"
path = "benches/citations.rs"
harness = false
[[bench]]
name = "waf"
path = "benches/waf.rs"
harness = false
[dependencies.ahash]
version = "0.8"
[dependencies.aho-corasick]
version = "1"
[dependencies.arc-swap]
version = "1"
[dependencies.async-trait]
version = "0.1"
[dependencies.axum]
version = "0.8"
optional = true
[dependencies.base64]
version = "0.22"
optional = true
[dependencies.blake3]
version = "1"
[dependencies.chromiumoxide]
version = "0.9"
optional = true
default-features = false
[dependencies.chrono]
version = "0.4"
features = ["serde"]
[dependencies.crawlberg-browser]
version = "1.0.5"
optional = true
[dependencies.dashmap]
version = "6"
[dependencies.dirs]
version = "6"
optional = true
[dependencies.encoding_rs]
version = "0.8"
[dependencies.flate2]
version = "1"
[dependencies.futures]
version = "0.3"
[dependencies.html-to-markdown-rs]
version = "3.8"
features = ["full"]
[dependencies.ipnet]
version = "2"
[dependencies.liter-llm]
version = "1.9"
features = ["native-http"]
optional = true
[dependencies.memchr]
version = "2"
[dependencies.minijinja]
version = "2"
optional = true
[dependencies.notify]
version = "8"
[dependencies.opentelemetry]
version = "0.32"
features = [
"trace",
"metrics",
]
[dependencies.opentelemetry-otlp]
version = "0.32"
features = [
"grpc-tonic",
"trace",
"metrics",
]
optional = true
[dependencies.opentelemetry-semantic-conventions]
version = "0.32"
[dependencies.opentelemetry_sdk]
version = "0.32"
features = ["rt-tokio"]
optional = true
[dependencies.quick-xml]
version = "0.41"
[dependencies.regex]
version = "1"
[dependencies.reqwest]
version = "0.13"
features = [
"cookies",
"gzip",
"brotli",
]
[dependencies.rmcp]
version = "2"
features = [
"server",
"macros",
"transport-io",
"transport-streamable-http-server",
]
optional = true
[dependencies.schemars]
version = "1.2"
optional = true
[dependencies.serde]
version = "1"
features = ["derive"]
[dependencies.serde_json]
version = "1"
[dependencies.sha2]
version = "0.11"
[dependencies.thiserror]
version = "2"
[dependencies.tl]
version = "0.7"
package = "astral-tl"
[dependencies.tokio]
version = "1"
features = [
"rt",
"macros",
"sync",
"time",
]
[dependencies.tokio-stream]
version = "0.1"
[dependencies.toml]
version = "1.1"
[dependencies.tower]
version = "0.5"
features = [
"timeout",
"retry",
"limit",
"util",
"make",
]
[dependencies.tower-http]
version = "0.7"
features = [
"cors",
"compression-full",
"trace",
"limit",
"catch-panic",
"request-id",
"sensitive-headers",
]
optional = true
[dependencies.tracing]
version = "0.1"
[dependencies.tracing-opentelemetry]
version = "0.33"
optional = true
[dependencies.tracing-subscriber]
version = "0.3.23"
features = [
"env-filter",
"json",
]
optional = true
[dependencies.url]
version = "2"
[dependencies.utoipa]
version = "5"
features = ["axum_extras"]
optional = true
[dependencies.uuid]
version = "1.23"
features = ["v4"]
optional = true
[dev-dependencies.async-trait]
version = "0.1"
[dev-dependencies.criterion]
version = "0.8"
features = ["html_reports"]
[dev-dependencies.proptest]
version = "1"
[dev-dependencies.serde_json]
version = "1"
[dev-dependencies.serial_test]
version = "3"
[dev-dependencies.tempfile]
version = "3"
[dev-dependencies.tokio]
version = "1"
features = ["full"]
[dev-dependencies.tokio-stream]
version = "0.1"
[dev-dependencies.wiremock]
version = "0.6"
[target.'cfg(not(target_arch = "wasm32"))'.dependencies.tokio]
version = "1"
features = [
"rt-multi-thread",
"net",
"fs",
"signal",
"process",
"io-util",
]
[target.'cfg(target_arch = "wasm32")'.dependencies.getrandom]
version = "0.4"
features = ["wasm_js"]
[target.'cfg(target_arch = "wasm32")'.dependencies.getrandom03]
version = "0.3"
features = ["wasm_js"]
package = "getrandom"
[lints.clippy.all]
level = "warn"
priority = -1
[lints.rust]
unsafe_code = "warn"
[lints.rust.unexpected_cfgs]
level = "warn"
priority = 0
check-cfg = ["cfg(alef)"]