Wednesday, July 8, 2026

# 🚀 Obscura — Headless Browser āļ•ัāļ§āļˆิ๋āļ§āđāļ•่āđāļˆ๋āļ§ āļŠāļģāļŦāļĢัāļšāļĒุāļ„ AI

## 1. Obscura āļ„ืāļ­āļ­āļ°āđ„āļĢ?


**Obscura** āļ„ืāļ­ headless browser engine āļ—ี่āđ€āļ‚ีāļĒāļ™āļ”้āļ§āļĒāļ āļēāļĐāļē **Rust** — āļĄัāļ™āļ„ืāļ­ "āđ€āļšāļĢāļēāļ§์āđ€āļ‹āļ­āļĢ์āļ—ี่āđ„āļĄ่āļĄีāļŦāļ™้āļē" āļ—ี่āļĢัāļ™ JavaScript āļœ่āļēāļ™ V8 engine āļžูāļ”āļ āļēāļĐāļē Chrome DevTools Protocol (CDP) āđ„āļ”้ āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠ้āđāļ—āļ™ headless Chrome āļŠāļģāļŦāļĢัāļš Puppeteer āđāļĨāļ° Playwright āđ„āļ”้āđāļšāļš **drop-in replacement**


āļžูāļ”āļ‡่āļēāļĒāđ† āļ„ืāļ­ Obscura āđ€āļ›็āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—ี่āđ€āļ›ิāļ”āđ€āļ§็āļš āļ­่āļēāļ™āđ€āļ™ื้āļ­āļŦāļē āļĢัāļ™ JavaScript āļ”ึāļ‡āļ‚้āļ­āļĄูāļĨ āđāļĨāļ°āļ—āļģāļ‡āļēāļ™āļ­ัāļ•āđ‚āļ™āļĄัāļ•ิ āđ‚āļ”āļĒāļ—ี่āđ„āļĄ่āļ•้āļ­āļ‡āļĄีāļŦāļ™้āļēāļˆāļ­ GUI āđ€āļĨāļĒ āđ€āļŦāļĄāļēāļ°āļĄāļēāļāļŠāļģāļŦāļĢัāļšāļ‡āļēāļ™ scraping, automation, AI agent browsing


**āļˆุāļ”āđ€āļ”่āļ™āļŠāļģāļ„ัāļ:**

- āđƒāļŠ้āļŦāļ™่āļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļ„่ **30 MB** (Chrome Headless āđƒāļŠ้ 200+ MB)

- Binary āļ‚āļ™āļēāļ”āđāļ„่ **70 MB** (Chrome Headless 300+ MB)

- Startup āđāļ—āļšāļˆāļ°āļ—ัāļ™āļ—ี

- Anti-detection āđƒāļ™āļ•ัāļ§ (stealth mode)

- āļĢāļ­āļ‡āļĢัāļšāļ—ั้āļ‡ CLI, CDP, MCP Protocol


---


## 2. āļ—āļģāđ„āļĄāļ•้āļ­āļ‡ Obscura? (āļ‚้āļ­āļ”ี)


### ✅ āļ‚้āļ­āļ”ี


| āļ„ุāļ“āļŠāļĄāļšัāļ•ิ | āļĢāļēāļĒāļĨāļ°āđ€āļ­ีāļĒāļ” |

|-----------|-----------|

| 🏎️ **āđ€āļĢ็āļ§āļĄāļēāļ** | āļŦāļ™้āļēāđ€āļ§็āļšāđ‚āļŦāļĨāļ”āđ€āļ‰āļĨี่āļĒ ~85 ms āđ€āļ—ีāļĒāļšāļัāļš Chrome ~500 ms |

| ðŸŠķ **āđ€āļšāļē** | RAM ~30 MB, Binary ~70 MB āđ„āļĄ่āļ•้āļ­āļ‡āļžึ่āļ‡ Chromium 300MB+ |

| ⚡ **Startup āļ—ัāļ™āļ—ี** | āđ„āļĄ่āļ•้āļ­āļ‡āļĢāļ­ 2-3 āļ§ิāđ€āļŦāļĄืāļ­āļ™ launch Chromium |

| ðŸ›Ą️ **Stealth āđƒāļ™āļ•ัāļ§** | TLS fingerprint, tracker blocking, profile randomization |

| ðŸ“Ķ **Binary āđ€āļ”ีāļĒāļ§** | āđ„āļĄ่āļ•้āļ­āļ‡āļ•ิāļ”āļ•ั้āļ‡ dependencies āđ€āļĒāļ­āļ° |

| 🔌 **āļĢāļ­āļ‡āļĢัāļš CDP** | āđƒāļŠ้ Puppeteer/Playwright āđ€āļŠื่āļ­āļĄāļ•่āļ­āđ„āļ”้āļ—ัāļ™āļ—ี |

| ðŸĪ– **MCP Protocol** | āđƒāļŦ้ AI Agent āđƒāļŠ้ browser automation āđ„āļ”้āđ‚āļ”āļĒāļ•āļĢāļ‡ |

| ðŸģ **Docker Ready** | Image ~57 MB āļšāļ™ distroless/cc |

| ðŸ§Đ **Rust Library** | āļัāļ‡ engine āđƒāļ™āđ‚āļ›āļĢāđ€āļˆāļāļ•์ Rust āđ„āļ”้ |

| 🗃️ **Persist Cookies** | āđ€āļ็āļš cookies/localStorage āļ‚้āļēāļĄ session |

| 🌐 **āļ‚้āļēāļĄāđāļžāļĨāļ•āļŸāļ­āļĢ์āļĄ** | Linux, macOS, Windows, Docker |


---


## 3. āļ‚้āļ­āļˆāļģāļัāļ”āđāļĨāļ°āļ‚้āļ­āđ€āļŠีāļĒ


### ❌ āļ‚้āļ­āđ€āļŠีāļĒ / āļŠิ่āļ‡āļ—ี่āđ„āļĄ่āļĢāļ­āļ‡āļĢัāļš


| āļ‚้āļ­āļˆāļģāļัāļ” | āļĢāļēāļĒāļĨāļ°āđ€āļ­ีāļĒāļ” |

|----------|-----------|

| ❌ **āđ„āļĄ่āļĄี Pixel Rendering** | `page.screenshot()`, `page.pdf()` āđƒāļŠ้āđ„āļĄ่āđ„āļ”้ — Obscura āđ„āļĄ่āļĄี GPU engine |

| ❌ **āđ„āļĄ่ bypass Cloudflare āđāļšāļšāļŦāļ™ัāļ** | Web Application Firewall āļ—ี่āļ•้āļ­āļ‡ JS computation challenge (Under Attack mode) āļˆāļ°āđ„āļĄ่āļœ่āļēāļ™ |

| ❌ **āđ„āļĄ่ bypass Datadome / Akamai** | Active bot management challenge |

| ❌ **āđ„āļĄ่āļĄี CAPTCHA solver** | āļ•้āļ­āļ‡āđƒāļŠ้ proxy + stealth āđ€āļžื่āļ­āđ€āļĨี่āļĒāļ‡ |

| ðŸ”ķ **V8 Isolate āđāļŠāļĢ์āļัāļ™** | āļ—ุāļāļŦāļ™้āļēāđ€āļ§็āļšāđƒāļŠ้ V8 isolate āđ€āļ”ีāļĒāļ§āļัāļ™ āļ–้āļēāļĄี JS āļŦāļ™ัāļāđ† āđƒāļ™āļŦāļ™้āļēāđ€āļ”ีāļĒāļ§āļˆāļ°āļ—āļģāđƒāļŦ้āļŦāļ™้āļēāļ­ื่āļ™āļ„้āļēāļ‡ |

| ðŸ”ķ **āđ„āļĄ่āļĄี Service Workers** | āđ„āļĄ่āļĢāļ­āļ‡āļĢัāļš Progressive Web App |

| ðŸ”ķ **Device Emulation āļˆāļģāļัāļ”** | viewport metadata āđ„āļ”้ āđāļ•่āđ„āļĄ่āļĄี real layout |

| ðŸ”ķ **GPU āđ„āļĄ่āļĄี** | āđ„āļĄ่āļĄี WebGL āļˆāļĢิāļ‡ (āđāļ•่āļĄี GPU renderer string āļ›āļĨāļ­āļĄāđƒāļŦ้ fingerprint āļŠāļĄāļšูāļĢāļ“์) |


### āđ€āļ›āļĢีāļĒāļšāđ€āļ—ีāļĒāļšāļัāļš agent-browser / Playwright āļˆāļĢิāļ‡


| Scenario | Obscura | Chrome Headless / Playwright |

|----------|---------|------------------------------|

| Scrape āđ€āļ§็āļšāļ—ั่āļ§āđ„āļ› | ✅ āđ€āļĢ็āļ§āļāļ§่āļē, āđ€āļšāļēāļāļ§่āļē | ✅ āļŠ้āļēāļāļ§่āļē āđāļ•่ reliable |

| āđ€āļ§็āļš JS-heavy (SPA) | ✅ āđ„āļ”้ | ✅ āđ„āļ”้ |

| āđ€āļ§็āļšāļĄี Cloudflare āļ›āļēāļ™āļāļĨāļēāļ‡ | ✅ āļœ่āļēāļ™ (stealth mode) | ✅ āļœ่āļēāļ™ |

| āđ€āļ§็āļšāļĄี Cloudflare āļŦāļ™ัāļ (Under Attack) | ❌ āđ„āļĄ่āļœ่āļēāļ™ | ✅ āļœ่āļēāļ™ (Chromium āļˆāļĢิāļ‡) |

| Screenshot/PDF | ❌ āđ„āļĄ่āļĄี | ✅ āļĄี |

| āđƒāļŠ้āļ‡āļēāļ™āđƒāļ™ Docker | ✅ 57MB Image | ❌ Image āđƒāļŦāļ่ |

| āđƒāļŠ้āļัāļš Puppeteer/Playwright code āđ€āļ”ิāļĄ | ✅ āļ•่āļ­ CDP āđ„āļ”้ | ✅ |


---


## 4. āđ€āļ—ีāļĒāļšāļัāļš Chrome Headless


| Metric | Obscura | Headless Chrome |

|--------|---------|-----------------|

| ðŸ’ū **Memory** | ~30 MB | 200+ MB |

| ðŸ“Ķ **Binary size** | ~70 MB | 300+ MB |

| 🚀 **Startup** | Instant (~0ms) | ~2 āļ§ิāļ™āļēāļ—ี |

| ⚡ **Page load** | ~85 ms | ~500 ms |

| ðŸ›Ą️ **Anti-detect** | ✅ Built-in | ❌ āđ„āļĄ่āļĄี |

| 🎭 **Puppeteer** | ✅ Yes (CDP) | ✅ Yes |

| 🎭 **Playwright** | ✅ Yes (CDP) | ✅ Yes |

| 🖞️ **Screenshot/PDF** | ❌ āđ„āļĄ่āļĄี | ✅ āļĄี |

| 🏭 **Deploy-friendly** | ✅ Binary āļ•ัāļ§āđ€āļ”ีāļĒāļ§ | ❌ āļ•้āļ­āļ‡āļĄี Chromium |


---


## 5. āļāļēāļĢāļ•ิāļ”āļ•ั้āļ‡


### Linux x86_64


```bash

# āļ”āļēāļ§āļ™์āđ‚āļŦāļĨāļ” binary

curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-x86_64-linux.tar.gz


# āđāļ•āļāđ„āļŸāļĨ์

tar xzf obscura-x86_64-linux.tar.gz


# āļ—āļ”āļŠāļ­āļš

./obscura --version


# (optional) āļĒ้āļēāļĒāđ„āļ› PATH

sudo mv obscura /usr/local/bin/

```


> āļ•้āļ­āļ‡āļāļēāļĢ glibc 2.35+ (Ubuntu 22.04 āļ‚ึ้āļ™āđ„āļ›)


### Linux ARM64


```bash

curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-aarch64-linux.tar.gz

tar xzf obscura-aarch64-linux.tar.gz

./obscura --version

```


### macOS Apple Silicon


```bash

curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-aarch64-macos.tar.gz

tar xzf obscura-aarch64-macos.tar.gz

./obscura --version

```


### macOS Intel


```bash

curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-x86_64-macos.tar.gz

tar xzf obscura-x86_64-macos.tar.gz

./obscura --version

```


### Windows


1. āđ„āļ›āļ—ี่ https://github.com/h4ckf0r0day/obscura/releases

2. āļ”āļēāļ§āļ™์āđ‚āļŦāļĨāļ” `.zip` āļŠāļģāļŦāļĢัāļš Windows

3. āđāļ•āļ zip āđāļĨ้āļ§āļĢัāļ™ `obscura.exe --version`


### Arch Linux (AUR)


```bash

yay -S obscura-browser

```


### Docker


```bash

docker pull h4ckf0r0day/obscura


# āļĢัāļ™āđāļšāļš server

docker run -d \

  --name obscura \

  --restart unless-stopped \

  -p 127.0.0.1:9222:9222 \

  -v /srv/obscura/data:/data \

  h4ckf0r0day/obscura \

  serve --host 0.0.0.0 --storage-dir /data --stealth

```


> Image ~57 MB compressed āļšāļ™ `distroless/cc`


### Build āļˆāļēāļ Source


**Requirements:**

- Rust 1.75+ (`curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`)

- C compiler (gcc āļŦāļĢืāļ­ clang)

- āļžื้āļ™āļ—ี่āļ§่āļēāļ‡ ~5 GB (V8 compile)


```bash

# Clone

git clone https://github.com/h4ckf0r0day/obscura.git

cd obscura


# Build āļ›āļāļ•ิ (āđƒāļŠ้āđ€āļ§āļĨāļē ~5 āļ™āļēāļ—ีāļ„āļĢั้āļ‡āđāļĢāļ)

cargo build --release


# Build āļžāļĢ้āļ­āļĄ stealth (āđāļ™āļ°āļ™āļģ)

cargo build --release --features stealth


# āļĢāļ°āļšāļš OpenSSL āđ€āļ่āļē āļ­āļēāļˆāļ•้āļ­āļ‡āđƒāļŠ้

OPENSSL_NO_VENDOR=1 cargo build --release


# Binary āļ­āļĒู่āļ—ี่

./target/release/obscura --version


# Install system-wide

cargo install --path crates/obscura-cli

```


**āļŠิ่āļ‡āļ—ี่āļ­āļĒู่āđƒāļ™ archive:**

- `obscura` — CLI āđāļĨāļ° CDP server

- `obscura-worker` — helper āļŠāļģāļŦāļĢัāļšāļ„āļģāļŠั่āļ‡ `scrape` (āļ•้āļ­āļ‡āļ­āļĒู่ path āđ€āļ”ีāļĒāļ§āļัāļ™)


### Smoke Test āļŦāļĨัāļ‡āļ•ิāļ”āļ•ั้āļ‡


```bash

./obscura fetch https://example.com --eval "document.title"

# Expected: "Example Domain"

```


---


## 6. āļ„āļģāļŠั่āļ‡āļžื้āļ™āļāļēāļ™ (CLI)


### āļĢูāļ›āđāļšāļšāļ„āļģāļŠั่āļ‡


```bash

obscura [OPTIONS] <COMMAND> [URLS]

```


### 4 āļ„āļģāļŠั่āļ‡āļŦāļĨัāļ


| āļ„āļģāļŠั่āļ‡ | āđƒāļŠ้āļ—āļģāļ­āļ°āđ„āļĢ |

|--------|-----------|

| `fetch <URL>` | āđ‚āļŦāļĨāļ” URL āđ€āļ”ีāļĒāļ§, āļĢัāļ™ JS, āđāļŠāļ”āļ‡āļœāļĨāļĨัāļžāļ˜์ |

| `scrape [URLS]...` | āļĢัāļ™ JS āļžāļĢ้āļ­āļĄāļัāļ™āļŦāļĨāļēāļĒ URL |

| `serve` | āļĢัāļ™ CDP server āđƒāļŦ้ Puppeteer/Playwright āđ€āļŠื่āļ­āļĄāļ•่āļ­ |

| `mcp` | āļĢัāļ™āđ€āļ›็āļ™ MCP server āđƒāļŦ้ AI Agent āđƒāļŠ้āļ‡āļēāļ™ |


### Global Flags (āđƒāļŠ้āđ„āļ”้āļัāļšāļ—ุāļāļ„āļģāļŠั่āļ‡)


| Flag | āļ„āļģāļ­āļ˜ิāļšāļēāļĒ |

|------|----------|

| `--stealth` | āđ€āļ›ิāļ” stealth mode (TLS fingerprint + tracker blocking) |

| `--proxy <URL>` | āđƒāļŠ้ proxy (HTTP/SOCKS5) |

| `--user-agent <UA>` | āđ€āļ›āļĨี่āļĒāļ™ User-Agent |

| `--allow-private-network` | āļ­āļ™ุāļāļēāļ• localhost/192.168.x.x |

| `-v, --verbose` | āđāļŠāļ”āļ‡ log āđ€āļĒāļ­āļ°āļ‚ึ้āļ™ |

| `-q, --quiet` | āļ›ิāļ” log |

| `--v8-flags <FLAGS>` | āļ•ั้āļ‡āļ„่āļē V8 engine |

| `--storage-dir <DIR>` | āđ‚āļŸāļĨāđ€āļ”āļ­āļĢ์āđ€āļ็āļš cookies/localStorage |


---


## 7. āļāļēāļĢāļ”ึāļ‡āļ‚้āļ­āļĄูāļĨ (Extract Data)


### --dump āļĢูāļ›āđāļšāļšāļ•่āļēāļ‡āđ†


```bash

# HTML āļŦāļĨัāļ‡āļˆāļēāļāļĢัāļ™ JS (āļ„่āļēāđ€āļĢิ่āļĄāļ•้āļ™)

obscura fetch https://example.com --dump html


# āļ‚้āļ­āļ„āļ§āļēāļĄāļĨ้āļ§āļ™ (Plain text)

obscura fetch https://example.com --dump text


# Markdown (āđāļ™āļ°āļ™āļģāļŠāļģāļŦāļĢัāļš AI/LLM)

obscura fetch https://example.com --dump markdown


# āļĨิāļ‡āļ์āļ—ั้āļ‡āļŦāļĄāļ”āļšāļ™āļŦāļ™้āļē

obscura fetch https://example.com --dump links


# Sub-resources āļ—ั้āļ‡āļŦāļĄāļ” (script, img, iframe, fetch/XHR calls)

obscura fetch https://example.com --dump assets


# HTML āļ”ิāļšāļ่āļ­āļ™āļĢัāļ™ JS (āđ€āļŦāļĄืāļ­āļ™ server āļŠ่āļ‡āļĄāļē)

obscura fetch https://example.com --dump original


# Cookies āļ—ั้āļ‡āļŦāļĄāļ” (āļĢāļ§āļĄ HttpOnly āļ—ี่ document.cookie āļĄāļ­āļ‡āđ„āļĄ่āđ€āļŦ็āļ™)

obscura fetch https://example.com --dump cookies

```


### āļāļēāļĢāđƒāļŠ้ CSS Selector


```bash

# āđ€āļ‰āļžāļēāļ° content āļŦāļĨัāļ

obscura fetch https://example.com --selector "main" --dump markdown


# āđ€āļ‰āļžāļēāļ° article

obscura fetch https://example.com --selector "article.post" --dump markdown

```


### Markdown Extraction — āđ€āļŦāļĄāļēāļ°āļัāļš AI Agent āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°


```bash

# āļŠุāļ”āļĒāļ­āļ”āļŠāļģāļŦāļĢัāļš AI — markdown āļŠāļ°āļ­āļēāļ” āđ„āļĄ่āļĄี noise

obscura fetch https://docs.example.com/page --dump markdown --quiet


# āļšัāļ™āļ—ึāļāđ€āļ›็āļ™āđ„āļŸāļĨ์

obscura fetch https://docs.example.com/page --dump markdown -o page.md


# āļĢāļ­ SPA āđ‚āļŦāļĨāļ”āđ€āļŠāļĢ็āļˆāļ่āļ­āļ™

obscura fetch https://my-spa.example --wait-until load --dump markdown

```


**āļŠิ่āļ‡āļ—ี่āļ–ูāļāđāļ›āļĨāļ‡āđ€āļ›็āļ™ Markdown:**

✅ Headings, paragraphs, bold, italic, code spans

✅ Links (āļžāļĢ้āļ­āļĄ href), Images (āļžāļĢ้āļ­āļĄ src + alt)

✅ List, Block quotes, Code blocks, Tables


**āļŠิ่āļ‡āļ—ี่āļ–ูāļāļ•ัāļ”āļ­āļ­āļ:**

❌ `<script>`, `<style>`, `<noscript>`, inline styles, ARIA attributes, tracking pixels


---


## 8. JavaScript Evaluation


`--eval` āļĢัāļ™ JavaScript āļšāļ™āļŦāļ™้āļēāđ€āļ§็āļšāđāļĨāļ°āļ„ืāļ™āļ„่āļēāđ€āļ›็āļ™ JSON


### Single Expression


```bash

# āļ”ึāļ‡ title

obscura fetch https://example.com --eval "document.title"

# → "Example Domain"


# āļ”ึāļ‡ structured data

obscura fetch https://news.ycombinator.com --eval \

  "Array.from(document.querySelectorAll('.titleline a')).slice(0,5).map(a => a.textContent)"

```


### Multi-statement (IIFE Pattern)


```bash

obscura fetch https://example.com --eval "(function(){

  const links = document.querySelectorAll('a');

  return Array.from(links).map(a => ({text: a.textContent, href: a.href}));

})()"

```


> ⚠️ **āļ‚้āļ­āļ„āļ§āļĢāļĢāļ°āļ§ัāļ‡:** āļ–้āļēāđ€āļ‚ีāļĒāļ™ `const` āļŦāļĢืāļ­ `let` āļ—ี่ top-level āđ‚āļ”āļĒāļ•āļĢāļ‡ āļˆāļ°āļ„ืāļ™ `null` āđ€āļžāļĢāļēāļ° V8 āđƒāļŦ้ top-level declaration āļĄี completion value āđ€āļ›็āļ™ `null`  

> ✅ **āļ§ิāļ˜ีāđāļ้:** āđƒāļŠ้ IIFE `(function(){...})()` āļ—ุāļāļ„āļĢั้āļ‡āļ—ี่āļĄีāļŦāļĨāļēāļĒ statement


### Wait Options


```bash

# āļĢāļ­āļ—ุāļāļ­āļĒ่āļēāļ‡ (āļ„่āļēāđ€āļĢิ่āļĄāļ•้āļ™ āđāļ•่āļŠ้āļēāļ—ี่āļŠุāļ”)

--wait-until load


# HTML parsed + scripts āļĢัāļ™āđāļĨ้āļ§ (āđāļ™āļ°āļ™āļģ - āđ€āļĢ็āļ§āļāļ§่āļē)

--wait-until domcontentloaded


# āļĢāļ­āđƒāļŦ้ network connections ≤2 āđ€āļ›็āļ™āđ€āļ§āļĨāļē 500ms

--wait-until networkidle2


# āļĢāļ­āđƒāļŦ้ network connections =0 āđ€āļ›็āļ™āđ€āļ§āļĨāļē 500ms

--wait-until networkidle0


# Extra wait āļŦāļĨัāļ‡ page settle (default 5s)

--wait 3

```


---


## 9. Stealth Mode āđāļĨāļ° Proxy


### Stealth Mode


```bash

# āđ€āļ›ิāļ” stealth

obscura fetch https://example.com --stealth

obscura serve --stealth

```


**Stealth āļ—āļģāļ­āļ°āđ„āļĢāļš้āļēāļ‡:**

1. āđƒāļŠ้ HTTP client āļ—ี่āļĄี TLS fingerprint āļ•āļĢāļ‡āļัāļš Chrome āļˆāļĢิāļ‡ (ClientHello, ALPN, cipher order)

2. āđ‚āļŦāļĨāļ” tracker blocklist — āļ›ิāļ”āļั้āļ™ analytics/fingerprinting endpoints

3. āđƒāļŠ้ webpki roots āđāļ—āļ™ system certificate store

4. Browser profile — `navigator.platform`, `userAgentData`, GPU renderer āļŠāļ­āļ”āļ„āļĨ้āļ­āļ‡āļัāļ™


**āļŠิ่āļ‡āļ—ี่ Stealth āļˆัāļ”āļāļēāļĢāđ„āļ”้:**

- ✅ Basic bot detection (TLS fingerprint, User-Agent)

- ✅ āđ€āļ§็āļšāļ—ี่āļžึ่āļ‡āļžāļē third-party analytics


**āļŠิ่āļ‡āļ—ี่ Stealth āļˆัāļ”āļāļēāļĢāđ„āļĄ่āđ„āļ”้:**

- ❌ Cloudflare interactive challenges (JS computation challenge)

- ❌ Datadome, Akamai bot manager

- ❌ CAPTCHA

- ❌ IP-based rate limiting (āļ•้āļ­āļ‡āđƒāļŠ้ proxy)


### Browser Profile


```bash

# Profile āļ›āļāļ•ิ (stable, āļ•ัāļ§āđ€āļ”ีāļĒāļ§)

obscura serve --stealth


# āđ€āļĨืāļ­āļ profile index

OBSCURA_PROFILE=2 obscura serve


# āļŦāļĄุāļ™ profile āļ­ัāļ•āđ‚āļ™āļĄัāļ•ิ (random āļ—ุāļ context)

OBSCURA_ROTATE_PROFILE=1 obscura serve

```


**āļ‚้āļ­āļ„āļ§āļĢāļĢāļ°āļ§ัāļ‡:** āļ–้āļēāđƒāļŠ้ proxy āļ­āļĒ่āļēāļŦāļĄุāļ™ profile āđ€āļžāļĢāļēāļ°āļāļēāļĢāļŦāļĄุāļ™ identity āđāļ•่ IP āđ€āļ”ิāļĄ = suspicious


### Timezone & Geolocation


```bash

# āļ•ั้āļ‡āđ€āļ§āļĨāļēzone āđƒāļŦ้āļ•āļĢāļ‡āļัāļš proxy region

OBSCURA_TIMEZONE=Asia/Bangkok obscura serve


# āļ•ั้āļ‡āļžิāļัāļ” GPS

OBSCURA_GEOLOCATION="13.7563,100.5018" obscura serve

```


### Proxy


```bash

# HTTP proxy

obscura fetch https://example.com --proxy http://proxy.example.com:8080


# HTTP proxy āļžāļĢ้āļ­āļĄ auth

obscura fetch https://example.com --proxy http://user:[email protected]:8080


# SOCKS5

obscura fetch https://example.com --proxy socks5://proxy.example.com:1080


# āļĢāļ§āļĄ stealth + proxy + custom UA

obscura serve \

  --stealth \

  --proxy http://user:[email protected]:8080 \

  --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ..."

```


---


## 10. āļāļēāļĢāđƒāļŠ้āļ‡āļēāļ™āļัāļš Puppeteer / Playwright


### āđ€āļĢิ่āļĄ CDP Server


```bash

obscura serve --port 9222

# → obscura listening on ws://127.0.0.1:9222

```


### Puppeteer


```bash

npm install puppeteer-core

```


```javascript

const puppeteer = require('puppeteer-core');


const browser = await puppeteer.connect({

  browserWSEndpoint: 'ws://127.0.0.1:9222',

});

const page = await browser.newPage();

await page.goto('https://example.com');

console.log(await page.title()); // "Example Domain"

await browser.disconnect();

```


> ⚠️ āđƒāļŠ้ `puppeteer-core` āđ„āļĄ่āđƒāļŠ่ `puppeteer` (puppeteer āđāļšāļšāđ€āļ•็āļĄāļˆāļ°āđ‚āļŦāļĨāļ” Chromium āļĄāļēāđƒāļŦ้)


### Playwright


```bash

npm install playwright

```


```javascript

const { chromium } = require('playwright');


const browser = await chromium.connectOverCDP('ws://127.0.0.1:9222');

const context = browser.contexts()[0] || await browser.newContext();

const page = await context.newPage();

await page.goto('https://example.com');

console.log(await page.title());

await browser.close();

```


> ⚠️ āđƒāļŠ้ `connectOverCDP` āđ„āļĄ่āđƒāļŠ่ `connect` (connect āđƒāļŠ้ protocol āļ‚āļ­āļ‡ Playwright āđ€āļ­āļ‡)


### āļŠิ่āļ‡āļ—ี่āļĢāļ­āļ‡āļĢัāļš


| āļŸีāđ€āļˆāļ­āļĢ์ | āļĢāļ­āļ‡āļĢัāļš? |

|---------|:-------:|

| `page.goto`, `page.reload`, `page.goBack`, `page.goForward` | ✅ |

| `page.evaluate`, `page.evaluateHandle` | ✅ |

| `page.click`, `page.type`, `page.fill`, `page.focus` | ✅ |

| `page.waitForSelector`, `page.waitForFunction`, `page.waitForNavigation` | ✅ |

| `page.cookies`, `page.setCookie`, `context.cookies` | ✅ |

| `page.setRequestInterception` (block/modify) | ✅ |

| `page.exposeFunction` | ✅ |

| `page.content`, `page.title`, `page.url` | ✅ |

| DOM Agent frameworks (browser-use) | ✅ |

| `page.screenshot()`, `page.pdf()` | ❌ āđ„āļĄ่āļĄี pixel rendering |

| Service Workers | ❌ |


---


## 11. MCP Server — āđƒāļŦ้ AI Agent āđƒāļŠ้ Browser


Obscura āļĄี MCP (Model Context Protocol) server āđƒāļ™āļ•ัāļ§ āļ—āļģāđƒāļŦ้ AI Agent āđ€āļŠื่āļ­āļĄāļ•่āļ­āđāļĨāļ°āđƒāļŠ้ browser automation āđ„āļ”้āļ—ัāļ™āļ—ี


### āļĢัāļ™ MCP Server


```bash

# Stdio mode (default — āļŠāļģāļŦāļĢัāļš Claude Desktop āđ‚āļ”āļĒāļ•āļĢāļ‡)

obscura mcp


# HTTP mode (āļŠāļģāļŦāļĢัāļš remote āļŦāļĢืāļ­ container)

obscura mcp --http --port 3000


# HTTP + bind all interfaces (āđƒāļ™ Docker)

obscura mcp --http --host 0.0.0.0 --port 3000


# āļžāļĢ้āļ­āļĄ stealth + proxy

obscura mcp --stealth --proxy http://proxy.example.com:8080

```


### āļāļēāļĢāđ€āļŠื่āļ­āļĄāļ•่āļ­āļัāļš Claude Desktop


āđāļ้āđ„āļ‚ `claude_desktop_config.json`:


```json

{

  "mcpServers": {

    "obscura": {

      "command": "/path/to/obscura",

      "args": ["mcp", "--stealth"]

    }

  }

}

```


### āļāļēāļĢāđ€āļŠื่āļ­āļĄāļ•่āļ­āļัāļš Claude Code


```bash

claude mcp add obscura /path/to/obscura mcp

```


### āđ€āļ„āļĢื่āļ­āļ‡āļĄืāļ­ MCP āļ—ี่ Obscura āđƒāļŦ้


**Navigation:**

- `browser_navigate`, `browser_back`, `browser_forward`, `browser_reload`, `browser_close`


**Read page:**

- `browser_snapshot` — DOM/accessibility snapshot

- `browser_markdown`, `browser_links`, `browser_extract`

- `browser_interactive_elements`, `browser_detect_forms`

- `browser_get_attribute`, `browser_count`, `browser_search`


**Interactive:**

- `browser_click`, `browser_fill`, `browser_fill_form`

- `browser_type`, `browser_press_key`, `browser_select_option`, `browser_scroll`


**Wait & JS:**

- `browser_wait_for`, `browser_wait_for_text`, `browser_evaluate`


**Cookies & Storage:**

- `browser_get_cookies`, `browser_set_cookie`, `browser_clear_cookies`

- `browser_storage_state`, `browser_set_storage_state`


**Network:**

- `browser_network_requests`, `browser_console_messages`


**Tabs:**

- `browser_tab_new`, `browser_tab_list`, `browser_tab_switch`, `browser_tab_close`


### Security (HTTP transport)


```bash

# āļˆāļģāļัāļ”āđ€āļ‰āļžāļēāļ° Origin āļ—ี่āļ­āļ™ุāļāļēāļ•

OBSCURA_MCP_ALLOWED_ORIGINS="https://app.example.com" obscura mcp --http


# Body cap 16 MiB (default — āļ›้āļ­āļ‡āļัāļ™ large allocation)

```


---


## 12. Production Deployment


### Docker (Production)


```bash

docker run -d \

  --name obscura \

  --memory=4g --cpus=2 \

  --restart unless-stopped \

  -p 127.0.0.1:9222:9222 \

  -v /srv/obscura/data:/data \

  h4ckf0r0day/obscura \

  serve --host 0.0.0.0 --storage-dir /data --stealth

```


### Systemd service


```ini

# /etc/systemd/system/obscura.service

[Unit]

Description=Obscura headless browser

After=network.target


[Service]

ExecStart=/usr/local/bin/obscura serve --port 9222 --stealth --storage-dir /var/lib/obscura

Restart=always

RestartSec=5

User=obscura

Group=obscura

LimitNOFILE=65536

MemoryMax=4G

MemoryHigh=3G


[Install]

WantedBy=multi-user.target

```


```bash

sudo systemctl enable --now obscura

sudo journalctl -fu obscura

```


### Workers (Multi-core)


```bash

# 1 worker āļ•่āļ­ 1 CPU core

obscura serve --workers 4

```


### Parallel Scrape


```bash

# Scrape 20 URL āļžāļĢ้āļ­āļĄāļัāļ™

obscura scrape \

  --concurrency 20 \

  --format json \

  --timeout 60 \

  --stealth \

  url1 url2 url3 ...


# āļŦāļĢืāļ­āļ­่āļēāļ™āļˆāļēāļ stdin

cat urls.txt | obscura scrape --concurrency 20 --stealth -

```


> ⚠️ āļ•้āļ­āļ‡āļĄี `obscura-worker` āļ­āļĒู่āļ‚้āļēāļ‡āđ† `obscura` āđƒāļ™ PATH


### V8 Heap Management


```bash

# Default: --max-old-space-size=4096 (4GB) 

# āļĨāļ”āļŠāļģāļŦāļĢัāļšāđ€āļ„āļĢื่āļ­āļ‡ RAM āļ™้āļ­āļĒ

obscura serve --v8-flags "--max-old-space-size=2048"

```


### Timeouts (āļ›้āļ­āļ‡āļัāļ™ session āļ„้āļēāļ‡)


```bash

OBSCURA_NAV_TIMEOUT_MS=60000 \

OBSCURA_CDP_COMMAND_TIMEOUT_MS=30000 \

OBSCURA_FETCH_TIMEOUT_MS=20000 \

  obscura serve

```


### Persist Cookies & Storage


```bash

# CLI

obscura fetch https://example.com --storage-dir ./obscura-data


# Server

obscura serve --storage-dir ./obscura-data


# āļŦāļĨāļēāļĒ identity āđāļĒāļ directory

obscura serve --port 9222 --storage-dir ./identity-a

obscura serve --port 9223 --storage-dir ./identity-b

```


**āļ āļēāļĒāđƒāļ™ `--storage-dir`:**

- `cookies.json` — cookie jar (inspect āļ”้āļ§āļĒ `jq`)

- `localStorage/*.json` — 1 file āļ•่āļ­ origin


**āđ€āļĄื่āļ­ state āļ–ูāļāđ€āļ‚ีāļĒāļ™:**

- āļ•āļ­āļ™ process exit

- āļŦāļĨัāļ‡ navigation āđ€āļŠāļĢ็āļˆ

- āļœ่āļēāļ™ CDP `Network.setCookie`


---


## 13. Environment Variables


### Runtime


| Variable | āļ„่āļēāđ€āļĢิ่āļĄāļ•้āļ™ | āļ„āļģāļ­āļ˜ิāļšāļēāļĒ |

|----------|-----------|---------|

| `OBSCURA_ALLOW_PRIVATE_NETWORK` | off | āļ­āļ™ุāļāļēāļ• localhost/192.168.x.x (āļ•ั้āļ‡āđ€āļ›็āļ™ `1`) |

| `OBSCURA_NAV_TIMEOUT_MS` | 30000 | Timeout navigation (ms) |

| `OBSCURA_CDP_COMMAND_TIMEOUT_MS` | 60000 | Timeout āđāļ•่āļĨāļ° CDP command (ms) |

| `OBSCURA_FETCH_TIMEOUT_MS` | 30000 | Timeout fetch/XHR (ms) |


### Stealth & Identity


| Variable | āļ„่āļēāđ€āļĢิ่āļĄāļ•้āļ™ | āļ„āļģāļ­āļ˜ิāļšāļēāļĒ |

|----------|-----------|---------|

| `OBSCURA_TIMEZONE` | Europe/Berlin | Timezone āļŠāļģāļŦāļĢัāļš fingerprint |

| `OBSCURA_GEOLOCATION` | fixed default | āļžิāļัāļ” GPS (`lat,lon`) |

| `OBSCURA_PROFILE` | 0 (stable) | āđ€āļĨืāļ­āļ browser profile index |

| `OBSCURA_ROTATE_PROFILE` | off | āļŦāļĄุāļ™ profile āļ—ุāļ context |


### MCP Security


| Variable | āļ„āļģāļ­āļ˜ิāļšāļēāļĒ |

|----------|---------|

| `OBSCURA_MCP_ALLOWED_ORIGINS` | comma-separated origin allowlist |


### Logging


```bash

RUST_LOG=obscura=info obscura serve

RUST_LOG=obscura=debug obscura serve

RUST_LOG=obscura_cdp=trace,obscura_browser=debug obscura serve

```


### Build


```bash

OPENSSL_NO_VENDOR=1 cargo build --release

```


---


## 14. āļāļēāļĢāđƒāļŠ้āļ‡āļēāļ™āļŠāļģāļŦāļĢัāļš AI Agent (Hermes)


āļŠāļģāļŦāļĢัāļšāļāļēāļĢāđƒāļŠ้āļ‡āļēāļ™ Obscura āđƒāļ™ Hermes Agent (āļŦāļĢืāļ­ AI Agent āļ—ั่āļ§āđ„āļ›) āļĄี 2 āđāļ™āļ§āļ—āļēāļ‡:


### āļ§ิāļ˜ีāļ—ี่ 1: CLI Mode (āđāļ™āļ°āļ™āļģāļŠāļģāļŦāļĢัāļš Scraping)


āđƒāļŠ้āļœ่āļēāļ™ `terminal()` tool āđ‚āļ”āļĒāļ•āļĢāļ‡:


```bash

# Scrape āļŦāļ™้āļēāđ€āļ§็āļš

/home/tong/obscura fetch <URL> --dump markdown --quiet


# āļ”ึāļ‡ structured data

/home/tong/obscura fetch <URL> --quiet --eval "JS code"


# Batch scrape

/home/tong/obscura scrape --quiet --stealth --eval "document.title" URL1 URL2

```


**āļ‚้āļ­āļ”ี:** Binary āļ•ัāļ§āđ€āļ”ีāļĒāļ§, āđ€āļĢ็āļ§āļĄāļēāļ, āđ„āļĄ่āļ•้āļ­āļ‡ setup session

**āļ‚้āļ­āđ€āļŠีāļĒ:** āđāļ•่āļĨāļ°āļ„āļĢั้āļ‡āđ€āļ›็āļ™ session āđƒāļŦāļĄ่ (cookie āđ„āļĄ่ persist)


### āļ§ิāļ˜ีāļ—ี่ 2: MCP Mode (āđāļ™āļ°āļ™āļģāļŠāļģāļŦāļĢัāļš Interactive)


āļĢัāļ™ `obscura mcp --http` āđāļĨ้āļ§ configure Hermes āđƒāļŦ้āđƒāļŠ้ MCP tools:


```yaml

# āđƒāļ™ config.yaml āļ‚āļ­āļ‡ Hermes

mcp_servers:

  obscura:

    command: /home/tong/obscura

    args: ["mcp", "--stealth", "--http"]

    port: 3000

```


**āļ‚้āļ­āļ”ี:** āļĄี session āļ—ี่ persist, āļĢāļ­āļ‡āļĢัāļš interactive (click, fill form)

**āļ‚้āļ­āđ€āļŠีāļĒ:** āļ•้āļ­āļ‡āļĢัāļ™ background service, āļ—āļĢัāļžāļĒāļēāļāļĢāđ€āļžิ่āļĄ


### Skill āļŠāļģāļŦāļĢัāļš Hermes


āļĄี skill `web/obscura-browser` āļ—ี่āļŠāļēāļĄāļēāļĢāļ– load āđ€āļžื่āļ­āđƒāļŠ้āļ‡āļēāļ™:


```bash

# terminal āđ€āļĢีāļĒāļāđƒāļŠ้āļ•āļēāļĄ pattern āđƒāļ™ skill

/home/tong/obscura fetch <URL> --dump markdown --quiet --wait-until domcontentloaded

```


### Cron Job Integration


āđƒāļ™ cron job prompt āđƒāļŦ้āđƒāļŠ้ Obscura āđāļ—āļ™ browser tools:

```bash

# āđāļ—āļ™āļ—ี่āļˆāļ°āđƒāļŠ้ browser_navigate → āđƒāļŠ้:

/home/tong/obscura fetch <URL> --dump markdown --quiet --stealth

```


---


## 15. FAQ āļ›ัāļāļŦāļēāļ—ี่āļžāļšāļš่āļ­āļĒ


### Q: āļ•ิāļ”āļ•ั้āļ‡āđāļĨ้āļ§āļĢัāļ™āđ„āļĄ่āđ„āļ”้ "cannot execute binary file"

**A:** āđ€āļĨืāļ­āļ architecture āļœิāļ” āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ”้āļ§āļĒ `uname -m` āđāļĨ้āļ§āļ”āļēāļ§āļ™์āđ‚āļŦāļĨāļ” binary āļ—ี่āļ–ูāļāļ•้āļ­āļ‡


### Q: "GLIBC_2.35 not found"

**A:** āļĢāļ°āļšāļš Linux āđ€āļ่āļēāļāļ§่āļē Ubuntu 22.04 āđƒāļŠ้ Docker āđāļ—āļ™ āļŦāļĢืāļ­ build āļˆāļēāļ source


### Q: macOS Gatekeeper āļšāļĨ็āļ­āļ

**A:** `xattr -d com.apple.quarantine ./obscura`


### Q: āđƒāļŠ้ `--eval` āđāļĨ้āļ§āđ„āļ”้ `null`

**A:** āđƒāļŠ้ IIFE pattern: `(function(){...})()` āđāļ—āļ™āļāļēāļĢāđ€āļ‚ีāļĒāļ™ `const`/`let` āļ—ี่ top-level


### Q: āđ€āļˆāļ­ Cloudflare challenge

**A:** āđƒāļŠ้ `--stealth` + `--wait-until networkidle2` + `--wait 10` āļ–้āļēāļĒัāļ‡āđ„āļĄ่āļœ่āļēāļ™ āđāļŠāļ”āļ‡āļ§่āļēāđ€āļ›็āļ™ Under Attack mode — āļ•้āļ­āļ‡āđƒāļŠ้ Chromium āļˆāļĢิāļ‡āđāļ—āļ™


### Q: Scrape āļŦāļĨāļēāļĒ URL āđāļĨ้āļ§ error

**A:** āđƒāļŠ้ `--concurrency` āļ•่āļģāļĨāļ‡, āđ€āļžิ่āļĄ `--timeout`, āļŦāļĢืāļ­āđƒāļŠ้ `obscura serve` + Puppeteer/Playwright āđāļ—āļ™


### Q: āļ•้āļ­āļ‡āļāļēāļĢ screenshot

**A:** Obscura āđ„āļĄ่āļĢāļ­āļ‡āļĢัāļš pixel rendering āđƒāļŠ้ headless Chrome + screenshot tool āđāļĒāļ


### Q: Cookies āđ„āļĄ่ persist āļ‚้āļēāļĄ session

**A:** āđƒāļŠ้ `--storage-dir` āļāļģāļŦāļ™āļ” path āļ—ี่āđ€āļ็āļš cookies āđ„āļ§้


---


## 16. āļŠāļĢุāļ›


### Obscura āđ€āļŦāļĄāļēāļ°āļัāļšāđƒāļ„āļĢ?


| āļāļĨุ่āļĄ | āđ€āļŦāļĄāļēāļ°? | āđ€āļŦāļ•ุāļœāļĨ |

|------|:------:|--------|

| 🕷️ **Web Scraper** | ✅ **āđ€āļŦāļĄāļēāļ°āļĄāļēāļ** | āđ€āļĢ็āļ§, āđ€āļšāļē, stealth, markdown output |

| ðŸĪ– **AI Agent** | ✅ **āđ€āļŦāļĄāļēāļ°āļĄāļēāļ** | MCP native, CLI āđƒāļŠ้āļ‡่āļēāļĒ, resource āļ•่āļģ |

| 🧊 **QA / Test Automation** | ⚠️ **āļšāļēāļ‡āļŠ่āļ§āļ™** | Puppeteer/Playwright CDP āđ„āļ”้ āđāļ•่āđ„āļĄ่āļĄี screenshot |

| 🔎 **Data Scientist** | ✅ **āđ€āļŦāļĄāļēāļ°** | Extract markdown/link/cookie āđ„āļ”้āđ€āļĢ็āļ§ |

| 🏭 **Production Scraping** | ✅ **āđ€āļŦāļĄāļēāļ°** | Docker, systemd, worker scaling, timeouts āļ„āļĢāļš |


### āļˆุāļ”āđ€āļ”่āļ™āļ—ี่āļŠุāļ”āļ‚āļ­āļ‡ Obscura


1. **āđ€āļĢ็āļ§āđāļĨāļ°āđ€āļšāļē** — 30MB RAM, 70MB binary, startup instant — āļ™้āļ­āļĒāļāļ§่āļē Chrome Headless 10x

2. **Stealth āđƒāļ™āļ•ัāļ§** — āđ„āļĄ่āļ•้āļ­āļ‡āļŦāļē proxy/extension āđ€āļžิ่āļĄ

3. **MCP Protocol** — AI Agent āđƒāļŠ้ browser āđ„āļ”้āđ‚āļ”āļĒāļ•āļĢāļ‡

4. **Binary āđ€āļ”ีāļĒāļ§** — deploy āļ‡่āļēāļĒāļŠุāļ”āđ†


### āļˆุāļ”āļ­่āļ­āļ™āļ—ี่āļ•้āļ­āļ‡āļĢāļ°āļ§ัāļ‡


1. **āđ„āļĄ่āļĄี pixel rendering** — screenshot, PDF āđ„āļĄ่āđ„āļ”้

2. **āđ„āļĄ่ bypass Cloudflare āļŦāļ™ัāļ** — āļ•้āļ­āļ‡āļĄี Chromium āļˆāļĢิāļ‡āļŠāļģāļĢāļ­āļ‡

3. **V8 Isolate āđāļŠāļĢ์āļัāļ™** — JS āļŦāļ™ัāļāđ† āđƒāļ™āļŦāļ™้āļēāđ€āļ”ีāļĒāļ§āļāļĢāļ°āļ—āļšāļŦāļ™้āļēāļ­ื่āļ™


### āļ„āļģāđāļ™āļ°āļ™āļģāđƒāļ™āļāļēāļĢāđ€āļĨืāļ­āļāđƒāļŠ้


```

āļŦāļ™้āļēāđ€āļ§็āļšāļ—ั่āļ§āđ„āļ› → Obscura (āđ€āļĢ็āļ§, āđ€āļšāļē)

āļŦāļ™้āļēāđ€āļ§็āļšāļĄี Cloudflare → Obscura + --stealth

āļŦāļ™้āļēāđ€āļ§็āļšāļĄี CF Under Attack → Fallback āđ„āļ› Chromium āļˆāļĢิāļ‡

āļ•้āļ­āļ‡āļāļēāļĢ Screenshot → Obscura āđ„āļĄ่āđ„āļ”้ āđƒāļŠ้ tool āļ­ื่āļ™

āļ•้āļ­āļ‡āļāļēāļĢ Interactive browser session → Obscura MCP āļŦāļĢืāļ­ serve

```


---


> 📝 **āļ—้āļēāļĒāļšāļ—āļ„āļ§āļēāļĄ:** Obscura āđ€āļ›็āļ™āđ€āļ„āļĢื่āļ­āļ‡āļĄืāļ­āļ—ี่āđ€āļ›āļĨี่āļĒāļ™āļ§ิāļ˜ีāļ„ิāļ”āđ€āļĢื่āļ­āļ‡ headless browser āđ„āļ›āđ€āļĨāļĒ āļˆāļēāļāļ—ี่āđ€āļ„āļĒāļ•้āļ­āļ‡āļžึ่āļ‡ Chromium 300MB+ āļ•āļ­āļ™āļ™ี้āđ€āļĢāļēāļĄี binary 70MB āļ—ี่āļ—āļģāļ‡āļēāļ™āđ„āļ”้āđ€āļĢ็āļ§āļāļ§่āļēāđāļĨāļ°āļิāļ™āļ—āļĢัāļžāļĒāļēāļāļĢāļ™้āļ­āļĒāļāļ§่āļē āđ€āļŦāļĄāļēāļ°āļĄāļēāļāļŠāļģāļŦāļĢัāļšāļĒุāļ„āļ—ี่ AI Agent āļ•้āļ­āļ‡āđ€āļ›ิāļ”āđ€āļ§็āļšāļ­่āļēāļ™āļ‚้āļ­āļĄูāļĨāđ€āļ›็āļ™āļĢ้āļ­āļĒāđ€āļ›็āļ™āļžัāļ™āļ„āļĢั้āļ‡āļ•่āļ­āļ§ัāļ™!


> 🔗 **āļĨิāļ‡āļ์āļ—ี่āđ€āļี่āļĒāļ§āļ‚้āļ­āļ‡:**

> - Docs: https://docs.obscura.sh/

> - GitHub: https://github.com/h4ckf0r0day/obscura

> - Releases: https://github.com/h4ckf0r0day/obscura/releases

> - Issues: https://github.com/h4ckf0r0day/obscura/issues

No comments: