By the fastCRW team · Engineering deep-dive · Last reviewed 2026-01-01
Disclosure: fastCRW is local-first by design and we build it. The privacy mechanics below apply to any hosted-vs-self-hosted scraping decision, not just ours.
The metadata leak nobody prices in
When you scrape through a hosted API, the vendor doesn't just return your content — they necessarily see the request. Every URL you scrape, the timing, the frequency, the crawl shape, and often the extracted content itself transits a third party's infrastructure. For a public blog corpus, who cares. For a competitive-intelligence pipeline, an internal-tools scraper hitting authenticated pages, a legal-discovery crawl, or a health/finance data flow, the URL list is sensitive — it reveals what you're researching, who you're watching, and what your product does, before a single byte of content is considered.
This is the part most "is scraping legal/private" discussions miss: the privacy exposure of hosted scraping is not primarily about the scraped data, it's about the request metadata describing your intent. Local-first scraping closes that channel entirely because the request never leaves your boundary.
What "local-first" actually means here
Local-first is not "we don't log much." It's an architecture where the default execution path is on infrastructure you control, and the network egress is only to the target sites you're already choosing to hit — never to an intermediary scraping vendor. Properties that make it real:
- The engine runs in your trust boundary. Your VPC, your laptop, your air-gapped box. No request to scrape transits a vendor.
- No mandatory phone-home. The binary works offline-of-the-vendor; no license server, no telemetry that ships URLs.
- You own the egress IPs. Targets see your IPs (or proxies you chose), and you decide what's logged and for how long.
- Data never lands in third-party storage by default. Extracted content goes straight into your pipeline; there is no vendor-side cache, dataset, or KV store holding it.
The compliance dimension: data residency and processor sprawl
For regulated workloads the hosted model creates concrete problems beyond intuition:
- Sub-processor inventory. A hosted scraping API is a data processor in your GDPR/contractual chain, and it likely uses its own sub-processors (proxy networks, cloud providers, anti-bot vendors). Each is a row in your processor register and a thing your customers' DPAs may need to allow.
- Data-residency requirements. If your contract or jurisdiction requires processing inside a region, a hosted API that routes through arbitrary global proxy exit nodes can violate it by construction — you often cannot guarantee where the fetch physically executed.
- Right-to-be-forgotten and retention. If a vendor caches scraped content, you've extended your retention surface to systems you don't control and can't fully attest to in an audit.
- Authenticated/internal scraping. Sending credentials or session cookies for an internal tool through a third-party renderer is frequently an outright policy violation regardless of the vendor's security posture.
Local-first collapses most of this: a self-hosted engine in your own region, with no vendor sub-processors in the scrape path, removes entire rows from the processor register and makes residency a property of your own infra rather than a promise from a third party.
The honest counter-argument: proxies pull you back toward the cloud
Local-first is not a free privacy win in every case, and pretending otherwise would be exactly the kind of unverifiable claim this audience punishes. The tension: to scrape aggressively protected sites you often need a rotating residential/mobile proxy network, and running a high-quality one yourself is expensive and operationally heavy. The moment you route through a third-party proxy provider, that provider sees your egress — you've reintroduced a metadata intermediary, just a different one.
The honest framing is a spectrum, not a binary:
- Fully local, direct egress — maximum privacy, works for non-hostile targets, no intermediary sees your URLs. Best for sensitive corpora that aren't behind aggressive anti-bot.
- Local engine + your own proxy contracts — you still control the engine and logging; the proxy vendor sees egress but not your full pipeline/content. A reasonable middle ground for hostile targets with privacy needs.
- Fully hosted scraping API — least privacy: a single vendor sees URLs, timing, shape, and often content. Fine for public, non-sensitive data; a real exposure for everything else.
The point of local-first isn't "never use a proxy." It's that you decide where on this spectrum each workload sits, instead of a vendor's architecture deciding for you.
How fastCRW is built for this
fastCRW's design makes the local-first end of the spectrum genuinely practical, which is the part most tools get wrong (a "self-host option" that needs a 5-service stack and multi-GB RAM is not practically local-first for most teams):
- One small Rust binary, low idle footprint, small Docker image. It runs on a laptop, a $5 VPS, or inside a locked-down VPC subnet — no Redis, no Python, no Chromium to harden and patch.
- No mandatory phone-home. Self-hosted, it scrapes without contacting fastCRW infrastructure; your URL list never leaves your boundary.
- AGPL-3.0, full parity. The self-hosted engine is the complete engine — privacy-sensitive teams aren't pushed toward the cloud to get working anti-bot, which is the failure mode of crippled open-core.
- Identical API to the Cloud. Run sensitive workloads locally and non-sensitive bulk workloads on the Managed Cloud, with the same code — you can place each workload where its data-classification belongs and still share one integration.
Note the AGPL clarification that matters to legal: running the unmodified engine inside your own infra to scrape for your product carries no copyleft obligation, and using the Managed Cloud as a network client carries none either. The copyleft trigger is narrowly about distributing a modified engine over a network. See AGPL-3.0 for SaaS explained.
The audit and attestation dimension
Privacy isn't only about preventing exposure — for regulated teams it's about being able to prove what happened, and the hosted model makes proof structurally hard. When a third party performs the fetch, your audit trail depends on their logging, their retention, and their willingness to attest under your auditor's questions; you are vouching for a system you cannot inspect. With a local-first engine the scrape executes inside your observability boundary: your logs, your retention policy, your network captures, your SIEM. When an auditor asks "demonstrate that no data left region X" or "produce the access log for this URL on this date," the answer is a query against systems you own rather than a support ticket to a vendor and a hope. This shifts data governance from a contractual promise to a verifiable property — and for SOC 2 / ISO / sectoral audits, a verifiable property you can demonstrate is worth far more than a clause you have to trust, because auditors increasingly test claims rather than accept attestations.
The "URL is a credential" failure mode
A specific, under-appreciated exposure: many URLs are themselves secrets. Signed S3 links, password-reset and magic-link tokens, internal dashboards with capability URLs, API endpoints with keys in query strings, document shares with embedded access tokens — these grant access by mere possession of the URL. Scraping any of these through a hosted API hands the bearer token to a third party (and possibly its logs, caches, and sub-processors) as plain request metadata, independent of how sensitive the content is. This collapses the usual "is the data sensitive?" triage: even scraping innocuous content behind a capability URL is a credential disclosure if the URL itself is the credential. Local-first scraping is the only architecture where a capability URL never transits a party that could retain or replay it. The rule for any pipeline that might encounter signed or tokenized URLs is simple and absolute: those fetches stay inside your boundary, full stop, because you cannot rotate a token a vendor already logged.
A practical data-classification checklist
- Does the URL list itself reveal sensitive intent (competitors, M&A targets, legal matters, internal tools)? → local-first.
- Are you sending credentials/cookies to reach the page? → never through a third-party renderer; local-first.
- Is there a data-residency contractual or jurisdictional requirement? → self-host in-region; verify proxy egress region too.
- Is the content fully public and non-sensitive, and the target hostile (needs heavy proxies)? → hosted or local+proxy is a reasonable trade.
- Can you keep one integration across both placements? → yes, if the engine and Cloud share an identical API (fastCRW does).
Bottom line
The privacy question in scraping is mostly about the request metadata that describes your intent, not just the scraped content — and a hosted API sees all of it by construction. Local-first scraping is the only architecture that closes that channel, but it's a spectrum, not absolution: proxies can pull you back toward an intermediary. The right posture is to classify each workload and place it deliberately. A tiny single-binary engine with an identical hosted fallback lets you do that without maintaining two codebases — which is the practical reason local-first is finally realistic in 2026.
Run it inside your own boundary
docker compose up # local-first, no phone-home, AGPL-3.0
Managed Cloud for the non-sensitive bulk: one-time lifetime 500 free credits. fastcrw.com · GitHub
Related: AGPL-3.0 for SaaS explained · Open source web scraping · Self-host vs managed scraping
