[package]
edition = "2021"
rust-version = "1.91"
name = "browser_oxide"
version = "0.1.3"
authors = ["Yury Fedoseev"]
build = "build.rs"
autolib = false
autobins = false
autoexamples = false
autotests = false
autobenches = false
description = "Stealth headless browser engine in Rust: real HTML/CSS/DOM/JS, V8 via deno_core, own BoringSSL TLS/JA4 fingerprint, no Chromium, no CDP — for anti-bot web scraping, archival, and AI agents"
homepage = "https://github.com/yfedoseev/browser_oxide"
readme = "README.md"
keywords = [
"stealth-browser",
"headless-browser",
"anti-bot",
"web-scraping",
"tls-fingerprint",
]
categories = [
"web-programming",
"network-programming",
"api-bindings",
]
license = "MIT OR Apache-2.0"
repository = "https://github.com/yfedoseev/browser_oxide"
[features]
blocker = ["dep:adblock"]
default = []
webgl-render = ["glow"]
[lib]
name = "browser_oxide"
path = "src/lib.rs"
[[example]]
name = "canvas_fp_probe"
path = "examples/canvas_fp_probe.rs"
[[example]]
name = "classify_stdin"
path = "examples/classify_stdin.rs"
[[example]]
name = "fetch_probe"
path = "examples/fetch_probe.rs"
[[example]]
name = "getting_started"
path = "examples/getting_started.rs"
[[example]]
name = "ja4_capture"
path = "examples/ja4_capture.rs"
[[example]]
name = "nav_timed"
path = "examples/nav_timed.rs"
[[example]]
name = "parse_probe"
path = "examples/parse_probe.rs"
[[example]]
name = "sweep_metrics"
path = "examples/sweep_metrics.rs"
[[example]]
name = "thin_probe"
path = "examples/thin_probe.rs"
[[test]]
name = "anti_bot"
path = "tests/anti_bot.rs"
[[test]]
name = "api_completeness"
path = "tests/api_completeness.rs"
[[test]]
name = "audio_fingerprint"
path = "tests/audio_fingerprint.rs"
[[test]]
name = "audio_parity"
path = "tests/audio_parity.rs"
[[test]]
name = "audio_reference"
path = "tests/audio_reference.rs"
[[test]]
name = "basic"
path = "tests/basic.rs"
[[test]]
name = "behavioral_polish"
path = "tests/behavioral_polish.rs"
[[test]]
name = "blocker_rigorous_probe"
path = "tests/blocker_rigorous_probe.rs"
[[test]]
name = "browser_comparison"
path = "tests/browser_comparison.rs"
[[test]]
name = "canvas_paths"
path = "tests/canvas_paths.rs"
[[test]]
name = "capture_chrome_148_hello"
path = "tests/capture_chrome_148_hello.rs"
[[test]]
name = "chl_sites"
path = "tests/chl_sites.rs"
[[test]]
name = "chrome147_parity"
path = "tests/chrome147_parity.rs"
[[test]]
name = "chrome147_self_capture"
path = "tests/chrome147_self_capture.rs"
[[test]]
name = "chrome_compat"
path = "tests/chrome_compat.rs"
[[test]]
name = "chrome_deep"
path = "tests/chrome_deep.rs"
[[test]]
name = "computed_style"
path = "tests/computed_style.rs"
[[test]]
name = "csp_enforcement"
path = "tests/csp_enforcement.rs"
[[test]]
name = "debug_blocked"
path = "tests/debug_blocked.rs"
[[test]]
name = "debug_fixes"
path = "tests/debug_fixes.rs"
[[test]]
name = "deep_path_validation"
path = "tests/deep_path_validation.rs"
[[test]]
name = "diagnostic_audit"
path = "tests/diagnostic_audit.rs"
[[test]]
name = "diagnostic_browserleaks"
path = "tests/diagnostic_browserleaks.rs"
[[test]]
name = "diagnostic_creepjs"
path = "tests/diagnostic_creepjs.rs"
[[test]]
name = "diagnostic_js_surface"
path = "tests/diagnostic_js_surface.rs"
[[test]]
name = "diagnostic_pixelscan"
path = "tests/diagnostic_pixelscan.rs"
[[test]]
name = "diagnostic_screen"
path = "tests/diagnostic_screen.rs"
[[test]]
name = "diagnostic_screen_direct"
path = "tests/diagnostic_screen_direct.rs"
[[test]]
name = "diagnostic_zillow"
path = "tests/diagnostic_zillow.rs"
[[test]]
name = "dump_props"
path = "tests/dump_props.rs"
[[test]]
name = "e2e_browser"
path = "tests/e2e_browser.rs"
[[test]]
name = "fingerprint_scorers"
path = "tests/fingerprint_scorers.rs"
[[test]]
name = "fingerprint_suite"
path = "tests/fingerprint_suite.rs"
[[test]]
name = "font_metrics"
path = "tests/font_metrics.rs"
[[test]]
name = "h2_frame_bytes"
path = "tests/h2_frame_bytes.rs"
[[test]]
name = "holistic_sweep"
path = "tests/holistic_sweep.rs"
[[test]]
name = "humanize_signals"
path = "tests/humanize_signals.rs"
[[test]]
name = "iframe_fp_diag"
path = "tests/iframe_fp_diag.rs"
[[test]]
name = "iframe_isolation"
path = "tests/iframe_isolation.rs"
[[test]]
name = "integration"
path = "tests/integration.rs"
[[test]]
name = "leak_audit"
path = "tests/leak_audit.rs"
[[test]]
name = "mutation_observer"
path = "tests/mutation_observer.rs"
[[test]]
name = "navigation_primitives"
path = "tests/navigation_primitives.rs"
[[test]]
name = "phase7_ab_probe"
path = "tests/phase7_ab_probe.rs"
[[test]]
name = "png_byte_parity"
path = "tests/png_byte_parity.rs"
[[test]]
name = "png_chunks"
path = "tests/png_chunks.rs"
[[test]]
name = "proxy_roundtrip"
path = "tests/proxy_roundtrip.rs"
[[test]]
name = "public_detection"
path = "tests/public_detection.rs"
[[test]]
name = "quality_invariants"
path = "tests/quality_invariants.rs"
[[test]]
name = "real_world"
path = "tests/real_world.rs"
[[test]]
name = "realm_purity"
path = "tests/realm_purity.rs"
[[test]]
name = "runtime_env"
path = "tests/runtime_env.rs"
[[test]]
name = "social_profile"
path = "tests/social_profile.rs"
[[test]]
name = "spa_caps_diag"
path = "tests/spa_caps_diag.rs"
[[test]]
name = "storage_persistence"
path = "tests/storage_persistence.rs"
[[test]]
name = "sub_pixel_layout"
path = "tests/sub_pixel_layout.rs"
[[test]]
name = "supporting_apis"
path = "tests/supporting_apis.rs"
[[test]]
name = "sweep_variance"
path = "tests/sweep_variance.rs"
[[test]]
name = "tls_fingerprint"
path = "tests/tls_fingerprint.rs"
[[test]]
name = "tls_fingerprint_probe"
path = "tests/tls_fingerprint_probe.rs"
[[test]]
name = "v8_inspector_parity"
path = "tests/v8_inspector_parity.rs"
[[test]]
name = "v8_natives"
path = "tests/v8_natives.rs"
[[test]]
name = "v8_recursion"
path = "tests/v8_recursion.rs"
[[test]]
name = "verify_pass"
path = "tests/verify_pass.rs"
[[test]]
name = "w3c_apis"
path = "tests/w3c_apis.rs"
[[test]]
name = "warm_reuse_heap_growth"
path = "tests/warm_reuse_heap_growth.rs"
[[test]]
name = "warm_reuse_reset"
path = "tests/warm_reuse_reset.rs"
[[test]]
name = "wasm_smoke"
path = "tests/wasm_smoke.rs"
[[test]]
name = "webgl_byte_parity"
path = "tests/webgl_byte_parity.rs"
[[test]]
name = "webgl_parity"
path = "tests/webgl_parity.rs"
[[test]]
name = "webgl_render"
path = "tests/webgl_render.rs"
[[test]]
name = "worker"
path = "tests/worker.rs"
[[test]]
name = "worker_page_integration"
path = "tests/worker_page_integration.rs"
[[bench]]
name = "page_throughput"
path = "benches/page_throughput.rs"
harness = false
[dependencies.adblock]
version = "0.13"
optional = true
[dependencies.async-trait]
version = "0.1"
[dependencies.base64]
version = "0.23"
[dependencies.boring-sys2]
version = "4.15"
[dependencies.boring2]
version = "4.15"
features = [
"pq-experimental",
"cert-compression",
]
[dependencies.brotli]
version = "8"
[dependencies.bytes]
version = "1"
[dependencies.chrono]
version = "0.4"
[dependencies.deno_core]
version = "0.408"
[dependencies.deno_error]
version = "0.7"
[dependencies.flate2]
version = "1"
features = ["zlib-rs"]
default-features = false
[dependencies.fontdb]
version = "0.23"
default-features = false
[dependencies.foreign-types]
version = "0.5"
[dependencies.futures-util]
version = "0.3"
[dependencies.glow]
version = "0.18"
optional = true
[dependencies.h3]
version = "0.0.8"
[dependencies.h3-quinn]
version = "0.0.10"
[dependencies.html5ever]
version = "0.39"
[dependencies.http]
version = "1"
[dependencies.http2]
version = "0.5"
features = ["unstable"]
[dependencies.httparse]
version = "1"
[dependencies.image]
version = "0.25"
features = [
"png",
"jpeg",
]
default-features = false
[dependencies.lazy_static]
version = "1"
[dependencies.markup5ever]
version = "0.39"
[dependencies.percent-encoding]
version = "2"
[dependencies.png]
version = "0.17"
[dependencies.quinn]
version = "0.11"
[dependencies.rand]
version = "0.10"
[dependencies.rand_chacha]
version = "0.10"
[dependencies.rand_distr]
version = "0.6"
[dependencies.rustfft]
version = "6"
[dependencies.rustls]
version = "0.23"
features = [
"ring",
"std",
]
default-features = false
[dependencies.rustybuzz]
version = "0.20"
[dependencies.serde]
version = "1"
features = ["derive"]
[dependencies.serde_json]
version = "1"
[dependencies.serde_yaml_ng]
version = "0.10"
[dependencies.sha1]
version = "0.11"
[dependencies.sha2]
version = "0.11"
[dependencies.skia-safe]
version = "0.99"
[dependencies.swash]
version = "0.2"
[dependencies.taffy]
version = "0.12"
[dependencies.thiserror]
version = "2"
[dependencies.tokio]
version = "1"
features = ["full"]
[dependencies.tokio-boring2]
version = "4.15"
[dependencies.tokio-tungstenite]
version = "0.30"
features = ["rustls-tls-webpki-roots"]
[dependencies.tracing]
version = "0.1"
[dependencies.url]
version = "2"
[dependencies.webpki-root-certs]
version = "1.0"
[dependencies.webpki-roots]
version = "1"
[dependencies.zstd]
version = "0.13"
[dev-dependencies.criterion]
version = "0.5"
features = ["async_tokio"]
[dev-dependencies.futures-util]
version = "0.3"
[dev-dependencies.hex]
version = "0.4"
[dev-dependencies.serde]
version = "1"
features = ["derive"]
[dev-dependencies.serde_json]
version = "1"
[dev-dependencies.sha2]
version = "0.11"
[dev-dependencies.tokio]
version = "1"
features = [
"full",
"test-util",
]
[dev-dependencies.tokio-tungstenite]
version = "0.30"
[dev-dependencies.url]
version = "2"
[lints.clippy]
allow_attributes_without_reason = "deny"
doc_lazy_continuation = "allow"
doc_overindented_list_items = "allow"
too_many_arguments = "allow"