Built for AI Agents · No Chromium Required

The Browser for Agents.
See the live web. Interact with it.

Not a snapshot from a search index — the live page, fetched now. Not read-only — click, fill, screenshot, log in. One Rust binary with built-in V8, no Chromium required.

Humans have Chrome. Agents have Diting.

Install locally, start it, done — the HTTP API is the whole interface
curl -fsSL https://raw.githubusercontent.com/yinnho/diting/main/install.sh | sh && diting
1 Rust binary
0 Chromium dependency
30+ HTTP routes
~1s per live page fetch

Agents Are Blind on the Web Today

Agents can write code, edit documents, manage projects — but ask one to go look something up on the web and it stumbles. Every general-purpose tool falls short somewhere.

JS-rendered pages come back empty

SPAs and data-endpoint pages return skeleton HTML — the content is filled in by JavaScript that plain HTTP never sees.

→ Built-in V8 renders for real + js_extract pulls structured data
Cloudflare / anti-bot walls

Your server IP gets 403s, or hangs on "Just a moment..." challenge pages. The workflow dies right there.

→ Automatic Turnstile waiting + switchable stealth TLS fingerprints
Read-only can't act

Fetching pages is not browsing. The moment a flow needs clicks, forms, login or pagination, scrapers are done.

→ Persistent sessions with indexed click/input — browse like a human
Search returns stale snapshots

Search engines serve indexed results from days ago. Prices, stock levels and statuses have already moved.

→ Fetches the live page as it is now, not an index snapshot
Screenshots require Chromium

Vision input needs screenshots, but Puppeteer/Playwright drag in all of Chromium — too heavy for most servers.

→ Built-in rendering engine, pure CPU, zero Chromium
Raw HTML nobody can read

Generic crawlers return raw tag soup. The agent can't use it directly — someone has to clean it first.

→ Returns clean markdown, ready for the agent to consume

A Browser, Not a Search Engine

Search products give you snapshots from their index. A browser gives you the live page. An agent needs the world as it is now — not as a crawler stored it last week.

⚡ Real-time

Search indexes lag by days. We fetch the current page directly — prices, stock, statuses, latest posts. When the world changes, fetch again. Agents shouldn't see yesterday's web.

🌐 Unlimited reach

Search only covers what got indexed. A browser reaches any URL — pages behind login, JS-rendered SPAs, paginated dashboards, anything needing a screenshot. Where search can't go, a browser can.

🤝 Interactive

Search reads summaries. A browser logs in, fills forms, submits, paginates, clicks through — operating the page like a person to get results search will never surface.

~1slive page fetch (first hit)
~100msrepeat fetch (cached)
~1sJS-rendered screenshot
~0.3s5-engine meta search
Measured in real use, not lab benchmarks. First hits include V8 cold start; cache hits run on plain HTTP.

Five Things an Agent Wants From a Browser

Today's options were built for debugging (Puppeteer) or are read-only (Firecrawl). Diting was designed around what agents actually need.

👁️

See

Our own diting rendering engine (pure CPU, Stylo/Taffy-lineage layout) paints the JS-rendered page to PNG — visual input for agents, no GPU needed.

POST /screenshot
📖

Read

Pages convert to clean markdown automatically; js_extract pulls structured data out of SPAs. Tiered rendering: static pages on plain HTTP ~100ms, V8 spins up only when JS is required — 10x faster on ~80% of pages.

POST /fetch
🔎

Find

Concurrent meta-search — Baidu / Bing / Sogou / WeChat / Google for the web, Stack Overflow + GitHub for code, arXiv for papers, your own Meilisearch index for private corpora — merged and deduplicated, with image search returning direct image URLs. Search → read in one step.

POST /search
🖐️

Act

Persistent browser sessions with indexed interaction — no guessing pixel coordinates; click index:3 presses the button. CAPTCHA auto-solve, Cloudflare auto-wait, reusable login state.

POST /session/create
⚡

Deploy

One binary ~70MB (~104MB with screenshots). No Node, no Chromium, no Docker. Run it under systemd and it's infrastructure.

Plain HTTP API

Where Other Agent Browsers Hit a Wall

Most new "agent browsers" are stateless, fingerprint-less one-shot renderers — fine for public pages, useless against Cloudflare or anything requiring login. Diting goes the other way and focuses on the three things they can't do.

🔐 Real TLS fingerprints

Stealth mode uses BoringSSL to replicate the complete Chrome145 / Firefox133 / Safari / Edge TLS handshakes (not just a UA swap), switchable per request; Cloudflare Turnstile challenges wait automatically for cf_clearance. Fingerprint-less engines eat 403s — we get through.

🤝 Stateful long sessions

Persistent sessions (8-minute idle keep-alive), login state injectable and exportable (session_create(cookies=...) ↔ session_cookies). Login → paginate → act, unbroken. One-shot engines discard state and can't do multi-step flows.

🔌 Plain HTTP, zero SDK

Every capability is a plain HTTP route — curl it from any language, any agent framework, any machine on your network. No protocol client to install, no DevTools to learn, no lock-in. The API is the whole interface.

Reference point: Cloudflare's Kitesurf explicitly ships neither real TLS-fingerprint negotiation nor persistent auth sessions — anti-bot and login territory is exactly where Diting plays.

What People Do With It

Not demos — real jobs agent browsers are doing today.

Grind through admin consoles

AWS, App Store Connect, Google Play — dozens of menu layers per task. Let the agent do the clicking and come back to you only when authorization is needed.

Batch actions behind login

Add a dozen items to a cart, dig through order history for receipts, check pages that only render while logged in. Inject cookies, operate, export the session for reuse.

Get past anti-bot walls

Cloudflare protection, Turnstile challenges, TLS fingerprint checks. Stealth mode pushes through instead of retreating at the first 403.

The Chinese internet

Meta-search across Baidu / Sogou / Sogou WeChat / Bing / Google, with correct rendering of Chinese pages. Not English-web-only.

Write scripts on the spot

Have the agent read the page, write JS, and eval it — highlight comparison tables, reflow content, filter products by hidden parameters. GreaseMonkey-on-steroids.

Multimodal vision input

Screenshots as vision input for "look and judge" flows — picking seats, recognizing page layouts, verifying that rendering looks right.

Security & Privacy

An agent's browser touches your cookies and your logged-in state. It shouldn't be a black box watching you, and it shouldn't expose your internal network to the agent.

🚫 No cookie / session persistence

Injected cookies and interactive sessions live in memory only, reclaimed after 8 minutes idle — gone when the session ends, nothing written to disk.

🛡️ SSRF + DNS rebinding protection

Non-http(s) schemes blocked, private/loopback IPs rejected, re-validation after every DNS resolution. The agent can't reach your intranet, and DNS rebinding doesn't work either.

🔒 Runs on your machine

Local install, local use — your cookies and sessions never leave the box. Want it locked down? Set DITING_TOKEN and every route requires a bearer token.

👁️ Fully open source

Apache-2.0, transparent and auditable. It runs on your machine — your data never leaves it.

🧩 CAPTCHA auto-solve

CAPTCHA type detection with optional 2captcha solving. Search flows stop dying on verification pages.

☁️ Cloudflare auto-wait

Detects "Just a moment..." challenge pages and waits out cf_clearance automatically, without breaking the agent's flow.

Three Ways to Use It

From "one line and you're running" to "private deployment, everything enabled". Check what's live anytime via /doctor.

TierIncludesStatus
🆓 Local install
Zero-config, free
fetch / search / eval / click / session — the full interaction suite over plain HTTP, listening on :8089 one installer, one binary, no config
⚡ Advanced
Feature flags
screenshot rendering / stealth TLS fingerprints / CAPTCHA auto-solve Build with --features stealth,screenshot (check what's compiled in via /doctor)
🏗 Self-hosted
Open source, private
Everything + private networks + custom proxies + no rate limits + full compliance control Apache-2.0 open source, single binary under systemd

Connect Your Agent

Plain HTTP, any agent, any language. Install locally and every capability is one POST away.

1 Install and start the server
# macOS / Linux / Windows git-bash — download, review, run
curl -fsSL https://raw.githubusercontent.com/yinnho/diting/main/install.sh -o install.sh && sh install.sh
diting &              # listens on 0.0.0.0:8089
curl -sS http://127.0.0.1:8089/health
2 Call the HTTP API
# Fetch a live page -> markdown
curl -sS -X POST http://127.0.0.1:8089/fetch \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com"}'

# Search -> merged and deduplicated
curl -sS -X POST http://127.0.0.1:8089/search \
  -H "Content-Type: application/json" \
  -d '{"q":"macbook price","max_results":5}'

# Capability listing (no fetching, instant)
curl -sS http://127.0.0.1:8089/doctor | jq .
3 Give your agent the trigger surface
# Installs SKILL.md so Claude Code reaches for the API proactively
# (download, review, then run - never blind-pipe from the network):
curl -fsSL https://raw.githubusercontent.com/yinnho/diting/main/skill.sh -o skill.sh
less skill.sh && bash skill.sh

# Or via the skills.sh directory:
npx skills add yinnho/diting