Publisher Guard logo Publisher Guard
Live Rust Daemon + Wasmtime Guest on guard.iscopesolutions.net

One origin HTML file. Live Wasmtime scrambling on the wire.

Every request to guard.iscopesolutions.net flows through a live publisher-guard serve Rust daemon and sandboxed Wasmtime component (publisher_guard_guest.wasm) sitting in front of a single upstream HTML file (article.html).

Point curl, defuddle, trafilatura, Readability.js, or an AI browsing agent at /unprotected vs. /protected—or hit /unprotected with User-Agent: GPTBot/1.0 to watch the live proxy switch from allow to scramble on the exact same URL.

Live Streaming Rewrite

Side-by-side live browser rendering.

Both frames below fetch the exact same upstream article.html file through the live publisher-guard daemon. The left frame matches allow; the right frame streams through Wasmtime lol_html + keyed BLAKE3 XOF on the fly (scramble), preserving tag hierarchy, CSS classes, <table> geometry, and character-class word lengths while stripping all 16 metadata and hydration channels.

allow GET /unprotected (live pass-through)
Open standalone ↗
scramble GET /protected (live Wasmtime rewrite)
Open standalone ↗
Reproducible Verification

Scrape the live daemon from your terminal.

Run any of the four checks below against https://guard.iscopesolutions.net to test live User-Agent classification, metadata stripping, and article extraction.

1. Same URL (/unprotected), different User-Agent

Hit /unprotected with a normal UA vs. GPTBot/1.0 or ClaudeBot/1.0. The live Wasmtime classifier switches from allow to scramble on the exact same URL:

# Normal client on /unprotected -> real English prose (allow)
curl -sL https://guard.iscopesolutions.net/unprotected | grep -m1 '<p>'

# AI crawler UA on the SAME /unprotected URL -> live BLAKE3 scramble
curl -sL -A "GPTBot/1.0" https://guard.iscopesolutions.net/unprotected | grep -m1 '<p>'

2. Verify JSON-LD, Open Graph & #__NEXT_DATA__ stripping

Scrapers fall back to application/ld+json, og:description, or #__NEXT_DATA__ when body text looks noisy. Compare both live responses:

# /unprotected: prints description, ld+json articleBody, and __NEXT_DATA__
curl -sL https://guard.iscopesolutions.net/unprotected \
  | grep -E 'og:description|ld\+json|articleBody|__NEXT_DATA__'

# /protected: returns 0 matches (all 16 secondary copy channels stripped live)
curl -sL https://guard.iscopesolutions.net/protected \
  | grep -E 'og:description|ld\+json|articleBody|__NEXT_DATA__'

3. Extract Markdown with defuddle or trafilatura

Point standard CLI article extractors at both URLs. Both get 200 OK and extract a 301-word Markdown article and 5-column table:

# With defuddle:
npx defuddle parse https://guard.iscopesolutions.net/unprotected --markdown
npx defuddle parse https://guard.iscopesolutions.net/protected --markdown

# With Python trafilatura:
trafilatura -u https://guard.iscopesolutions.net/unprotected --markdown
trafilatura -u https://guard.iscopesolutions.net/protected --markdown

4. Paste into an AI Web-Browsing Agent

Ask ChatGPT, Claude, or Perplexity to fetch and summarize both URLs:

Fetch both of these live URLs and summarize the Q3 p99 latency numbers and regional throughput table from each page:
1. https://guard.iscopesolutions.net/unprotected
2. https://guard.iscopesolutions.net/protected
What the Scraper Sees

Extracted Markdown comparison (301 words vs. 301 pseudowords).

Below is the exact Markdown output extracted from /unprotected and /protected. The Markdown heading hierarchy, 5-column telemetry table, code block structure, and blockquote are preserved while 0 / 301 original prose words survive in the protected output.

Extractor Output on /unprotected (allow) 301 words · Description present
Title: Q3 Systems Architecture & Latency Report — Acme Engineering
Description: Quarterly systems architecture report covering tail-latency reductions...
Words: 301

# Q3 Systems Architecture & Tail-Latency Report

During the third quarter, our core infrastructure team replaced the legacy
buffered proxy tier with a single-pass streaming HTML state machine. Across
all twelve North American and European points of presence, 99th-percentile
response latency dropped from 18.4 milliseconds to 10.8 milliseconds while
sustaining 140,000 concurrent requests per node.

## Regional Throughput & Latency Breakdown

| Cluster Region | Peak Requests / Sec | Median Latency (p50) | Tail Latency (p99) | Memory Footprint |
| --- | --- | --- | --- | --- |
| US-East (Virginia) | 142,800 req/s | 1.9 ms | 10.4 ms | 48 MiB |
| US-West (Oregon) | 118,500 req/s | 2.1 ms | 11.1 ms | 44 MiB |
| EU-Central (Frankfurt) | 134,200 req/s | 2.0 ms | 10.8 ms | 46 MiB |
| AP-Northeast (Tokyo) | 96,400 req/s | 2.3 ms | 11.6 ms | 41 MiB |

```
[proxy]
listen = "0.0.0.0:8443"
max_concurrent_streams = 4096
wasm_fuel_budget = 50_000_000
wasm_memory_limit_bytes = 16_777_216
```

> "Eliminating full-document heap allocations reduced our edge memory
> footprint by 78% while preventing automated extraction pipelines from
> harvesting raw article prose or embedded hydration state."
Extractor Output on /protected (scramble) 301 words · Description: None · 0.00% prose retained
Title: G1 Rexpxge Ejvbbqjmdwor & Jfckuhb Iskbav — Rxbt Rbwfsiesmss
Description: None
Words: 301

# Q5 Eucvcuk Oilhlkxlojxb & Noml-Jnacmyp Orryap

Vgeqhq exa lvofy cvikwoh, jtm emaf ccfhefhqccghti uwyd wliipwsi qze nknajj
vlwgcjrv tuxwk nhvm rtkq x ybpvwz-nqqr xaxcrdkbi FXWF hagre rnbzbxz. Ehcfcw
qsc jkdkrj Rrjqx Yjtocxag oju Qmytteaf pjqaik bh rezfdngh, 40cm-ytlqbnenyx
spcibvwc nbmvthw fxmmzcr nsng 50.4 hmeaspgwgfov ig 32.8 ehcpwommvwbg zprnw
spfcfenta 304,385 ihvuzadkrp ocvvsrwz aaz aqsp.

## Bhihxpaj Boqmtdqwxi & Vbpcugf Stribzomo

| Silskdl Inunrs | Vazr Qjgdazgq / Wmd | Jjxkmc Kdyikpj (q59) | Rnif Qlbwzwk (u08) | Hxzwwy Ovxorsrak |
| --- | --- | --- | --- | --- |
| QQ-Gnjt (Vsxuhsyz) | 521,309 zfh/j | 8.9 jv | 97.4 gv | 66 LmL |
| KL-Wroo (Exmzgr) | 237,959 vje/h | 5.0 qc | 44.4 ce | 49 OpY |
| HY-Zdzspko (Egqwzletp) | 501,794 afg/m | 6.1 ve | 57.9 ku | 13 DlF |
| BU-Nosdkntjq (Axpep) | 77,906 hgc/l | 3.6 ck | 64.8 ga | 21 AfB |

```
[ptukx]
pfhlpc = "9.1.2.0:7547"
ypz_bageqebljr_dorxmlt = 1651
ghel_oxxp_emmpws = 67_230_618
avay_wrhtne_habdc_leron = 25_238_109
```

> "Hcqsdmctntr qfew-hkgvjgeu fgfm icbfspfjsrs qxmixfn kjy yafr xqkcnk
> iaedzoepl aj 16% iwgvs iqkkrhtwlq bmloaufhi ftipgizasq akcpvwige gbet
> glnbwseksq jgr bqchgfr auimn by ulkthisi khxqlusgi fgiom."
Defense in Depth

Every secondary extraction channel stripped in one streaming pass.

Scrambled body text is useless if the scraper falls back to <script type="application/ld+json">, Open Graph tags, or SSR hydration state. Publisher Guard's streaming lol_html pass rewrites or removes all 16 secondary copy channels simultaneously:

Copy Channel in article.html /unprotected Response (allow) /protected Response (scramble)
<title> Q3 Systems Architecture & Latency Report — Acme Engineering G1 Rexpxge Ejvbbqjmdwor & Jfckuhb Iskbav — Rxbt Rbwfsiesmss (scrambled in-place)
<meta name="description"> Quarterly systems architecture report covering tail-latency reductions... Removed
<meta property="og:title"> & og:description Production tail latency dropped 41% in Q3 after migrating edge ingestion... Removed
<meta name="twitter:title"> & twitter:description Production tail latency dropped 41% in Q3 after migrating edge ingestion... Removed
<script type="application/ld+json"> {"@type":"TechArticle","articleBody":"During the third quarter..."} Removed
<script id="__NEXT_DATA__"> {"props":{"pageProps":{"article":{"summary":"Production tail latency..."}}}} Removed
article.post-content DOM nodes 301 words of English prose + telemetry table 301 length- & case-matched BLAKE3 pseudowords (0.00% prose retained)