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.
curl -fsSL https://raw.githubusercontent.com/yinnho/diting/main/install.sh | sh && diting
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.
SPAs and data-endpoint pages return skeleton HTML — the content is filled in by JavaScript that plain HTTP never sees.
Your server IP gets 403s, or hangs on "Just a moment..." challenge pages. The workflow dies right there.
Fetching pages is not browsing. The moment a flow needs clicks, forms, login or pagination, scrapers are done.
Search engines serve indexed results from days ago. Prices, stock levels and statuses have already moved.
Vision input needs screenshots, but Puppeteer/Playwright drag in all of Chromium — too heavy for most servers.
Generic crawlers return raw tag soup. The agent can't use it directly — someone has to clean it first.
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.
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.
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.
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.
Today's options were built for debugging (Puppeteer) or are read-only (Firecrawl). Diting was designed around what agents actually need.
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 /screenshotPages 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 /fetchConcurrent 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 /searchPersistent browser sessions with indexed interaction — no guessing pixel coordinates; click index:3 presses the button. CAPTCHA auto-solve, Cloudflare auto-wait, reusable login state.
One binary ~70MB (~104MB with screenshots). No Node, no Chromium, no Docker. Run it under systemd and it's infrastructure.
Plain HTTP APIMost 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.
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.
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.
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.
Not demos — real jobs agent browsers are doing today.
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.
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.
Cloudflare protection, Turnstile challenges, TLS fingerprint checks. Stealth mode pushes through instead of retreating at the first 403.
Meta-search across Baidu / Sogou / Sogou WeChat / Bing / Google, with correct rendering of Chinese pages. Not English-web-only.
Have the agent read the page, write JS, and eval it — highlight comparison tables, reflow content, filter products by hidden parameters. GreaseMonkey-on-steroids.
Screenshots as vision input for "look and judge" flows — picking seats, recognizing page layouts, verifying that rendering looks right.
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.
Injected cookies and interactive sessions live in memory only, reclaimed after 8 minutes idle — gone when the session ends, nothing written to disk.
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.
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.
Apache-2.0, transparent and auditable. It runs on your machine — your data never leaves it.
CAPTCHA type detection with optional 2captcha solving. Search flows stop dying on verification pages.
Detects "Just a moment..." challenge pages and waits out cf_clearance automatically, without breaking the agent's flow.
From "one line and you're running" to "private deployment, everything enabled". Check what's live anytime via /doctor.
| Tier | Includes | Status |
|---|---|---|
| 🆓 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 |
Plain HTTP, any agent, any language. Install locally and every capability is one POST away.
# 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
# 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 .
# 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