The browser engine built for agents. One Rust binary, zero Chromium, zero Docker. See, read, find, act, remember.
curl -fsSL https://raw.githubusercontent.com/yinnho/diting/main/install.sh | sh
diting # → HTTP on :8089, everything below is plain RESTExisting "browser automation" was built for humans or one-shot scraping. Agents need five things at once — see, read, find, act, remember — and they need them cheap:
- 7.6× faster to agent-usable text than headless Chrome (same 20 pages, same network, p50 532 ms vs 4 053 ms)
- ~25 MB cold start, <40 MB in everyday static use (measured whole-process); even a heavy JS page runs ~150 MB against Chrome's ~2 GB per page
- Zero hard failures where Chrome's dump-DOM produced nothing
An agent's total cost is browser efficiency × model efficiency. This is the browser half.
- Full browser, no Chromium — V8 + an owned Rust HTTP/CSS/layout/paint stack in one binary. Screenshots and rendering are built in; there is nothing to download and nothing to sandbox. Drove the most popular Chrome-based agent browser for a day and wrote down the difference first-hand: WHY-NO-CHROMIUM.md — 2.4× faster cold start, one dependency instead of a second browser, flat memory curve, receipts per response
- Real TLS fingerprints — production-grade impersonation that passes edge checks where fingerprint-less engines eat 403s; CAPTCHA and challenge pages are detected, waited on, and reported instead of handed over as content
- Stateful sessions — login state injects, exports, and survives restarts. The same session id comes back logged in
- Tiered rendering — static pages answer in ~100 ms; V8 spins up only when a page actually needs JS. Every response says which tier served it
- Meta-search — 20 engines across 7 categories (including the Chinese web), merged and deduplicated; reads land with section-level snippets
- Flows — a multi-step interaction an agent figured out becomes a replayable JSON document: reruns cost zero model tokens
- Documents — deterministic markdown → HTML + diagrams, byte-identical by construction; page sets export to PDF / PPTX / DOCX
- Receipts — every fetch reports its tier, redirect trail, and content hash. Agents act on what actually happened
- Local memory — fetch/search cache (SQLite FTS5) with CJK matching, so re-reads don't re-pay
# One-line installer: macOS (Apple Silicon / Intel), Linux (x86_64 / arm64), Windows (git-bash)
curl -fsSL https://raw.githubusercontent.com/yinnho/diting/main/install.sh -o install.sh
less install.sh && sh install.sh
# Or build from source (full features)
cargo build --release --features stealth,screenshot
diting & # listening on :8089
curl :8089/health # → {"status":"ok","engine":"diting"}
curl -X POST :8089/fetch -d '{"url":"https://example.com"}' | jq -r .markdown
curl -X POST :8089/search -d '{"query":"rust browser engine"}' | jq '.results[:3]'
curl -X POST :8089/session/create -d '{"url":"https://example.com"}' # → session_idComputer-use agents come in two layers: GUI-layer stacks drive a whole desktop; engine-layer browsers make the page itself the machine. Diting is the engine layer — DOM actions in, structured state out, one process per session instead of a VM. It is a real-time retrieval instrument, not a crawler: no link-following recursion, built-in per-domain budgets, robots.txt opt-in.
Self-host under Apache-2.0, or use the hosted instance at browser.aginx.net.
- Agent guide & route reference · install for LLM agents
- Works with existing Firecrawl clients (
/v1/scrape) and any HTTP client — no SDK required
diting's JavaScript runtime layer builds on work from the
Obscura project (Apache-2.0). Many
compatibility fixes track Obscura changes and are credited in source comments as
upstream <commit>. See NOTICE.