moli is a free, open source data extraction & web scraping project written in Rust and released under Apache-2.0. It has 2,065 GitHub stars, 139 forks and 126 open issues, and was last pushed 44 minutes ago. On this registry it ranks #53 of 83 tracked projects in Data Extraction & Web Scraping, with 5 head-to-head comparisons available.

Moli

English | 简体中文 | 日本語 | Deutsch | Français | Español

Discord

Moli is a production-ready headless browser for AI agents. Its on-demand layout and rendering design combines a complete browser runtime with a lightweight resource footprint.

Moli helps your AI agent fetch and extract web pages, search the web, and automate browser tasks.

Use it through the CLI, CDP, WebDriver Classic, or WebDriver BiDi.

Moli supports Linux, macOS, and Windows.

Quick start

Give this prompt to your AI agent:

Install the skills under https://github.com/lexmount/moli/tree/main/skills,
follow their instructions to download and install the latest prebuilt Moli
binary, then use moli-webfetch to fetch https://example.com and show me the
result.

Direct installation

On Linux or macOS:

curl --proto '=https' --tlsv1.2 -fsSL \
  https://github.com/lexmount/moli/releases/latest/download/moli-installer.sh | sh

On Windows, run in PowerShell:

powershell -ExecutionPolicy ByPass -c "irm https://github.com/lexmount/moli/releases/latest/download/moli-installer.ps1 | iex"

Showcase

An HTML5 game rendered by Moli and inspected live through Chrome DevTools.

rust-lang.org rendered by Moli, with its live DOM, CSS, and geometry available in Chrome DevTools.

CLI usage

Extract a page

Render the page as Markdown with Moli's default completion strategy:

moli fetch \
  --dump markdown \
  --wait-until done \
  https://example.com

Or directly return a compact, model-friendly semantic tree:

moli fetch \
  --dump semantic_tree_text \
  --wait-selector body \
  https://example.com

For visual output, enable on-demand layout and write a viewport PNG, a full-document PNG, or a paginated PDF:

moli fetch --layout --dump screenshot https://example.com > page.png
moli fetch --layout --dump screenshot_full https://example.com > full-page.png
moli fetch --layout --dump pdf https://example.com > page.pdf

Run fetch --help for the complete option list, including output formats, page-load/response waits, profiles, proxy settings, resource policies, and tracing options.

Start the automation server

# Basic automation server for DOM-first workloads
moli serve

# Enable real geometry, coordinate input, and screenshot/screencast surfaces
moli serve --layout

# Also fetch optional image, font, audio, video, media, and text-track resources
moli serve --layout --resource

The same endpoint serves all three protocols: CDP, WebDriver Classic, and WebDriver BiDi. Playwright can connect directly over CDP:

import { chromium } from "playwright";

const browser = await chromium.connectOverCDP("http://127.0.0.1:9222");
const context = browser.contexts()[0];
const page = context.pages()[0] ?? await context.newPage();

await page.goto("https://example.com");
console.log(await page.locator("body").innerText());

await browser.close();

Why Moli

Three qualities matter most for agent workloads, and Moli brings them together:

  • Full-featured — real JavaScript, DOM, CSS, networking, storage, layout, screenshots, and standard automation protocols, all integrated into one headless browser.
  • Fast — most automation requests never need visual rendering, so structure-first operations skip layout and paint entirely.
  • Resource-efficient — layout and pixels are generated only when needed, so Moli does not have to continuously maintain and update a fully rendered visual state.

What most browser automation tasks actually need is page structure, not a continuously rendered visual world. Moli treats the native DOM and style state as the single source of truth, triggering layout or software paint only for operations that genuinely require them.

Agent request What Moli does
Extract HTML/Markdown, query the DOM, run JS, inspect network/storage Reads browser runtime state directly — does not trigger layout or paint
Read an element's box, hit-test coordinates, send coordinate input Runs one layout calculation and retains only the latest frozen layout tree
Capture a screenshot Rebuilds from the current DOM/style, replaces the frozen tree, renders a fresh frame, and discards its paint state after use
Poll a screencast Compares generation metadata only; clean state emits no frame, while changed state rebuilds and emits one fresh frame

Moli still includes the complete set of capabilities: V8, CSS, layout, text shaping, hit-testing, software paint, and more. The only difference is when visual work runs and how long its results are retained. This cost model is especially well suited to crawling, browser-use agents, retrieval pipelines, evaluation environments, and reinforcement-learning workloads.

Current capabilities

  • Complete web runtime — streaming HTML parsing, native DOM, V8 JavaScript, modules/timers/microtasks/events, iframes and workers, CSS cascade, Fetch/XHR/WebSocket, cookies, WebCrypto, and profile-scoped storage (localStorage, IndexedDB, OPFS).
  • Extraction-optimized outputs — the CLI directly produces HTML, Markdown, JSON, semantic text trees, and frame-aware serialization, with selector/script/response waits and network tracing.
  • Unified automation binary — CDP, WebDriver Classic, and WebDriver BiDi share the same kernel and scheduler. No separate ChromeDriver, geckodriver, or browser installation is required.
  • Real visual capabilities on demand — add --layout to enable complete box construction, Taffy layout, Parley text layout, layout-backed hit-testing/input, viewport screenshots, and low-frequency CPU-rendered DevTools screencast frames.
  • Controllable operational options — profiles, cookies, HTTP cache, proxies, resource families, connection limits, timeouts, private-network policy, user-agent overrides, diagnostic logging, and network diagnostics are all available.

Moli's relationship with Lexmount

Moli is Lexmount's open-source headless browser; Lexmount Browser is the managed cloud runtime and control plane built around it.

The open-source headless browser is fully usable without Lexmount Browser.

Cost controls

Expensive browser operations in Moli require an explicit opt-in and are never enabled by default:

Mode or option Behavior
Default LayoutPolicy::Mock — deterministic geometry in a compatible format, with no real layout or paint
--layout LayoutPolicy::OnDemand — real layout, geometry, hit-testing, coordinate input, screenshots, screencast
--resource Fetch all optional visual/media resource families
--image, --font, --audio, --video, --media, --text-track Enable one specific optional resource family
--profile-dir, --http-cache-dir, --cookie-file Selectively enable the persistence required by the workload

Layout is an on-demand snapshot rather than continuously maintained state. The first geometry request (a cold start) builds a working layout tree from the current DOM/style, freezes its canonical geometry into an immutable, DOM-independent FrozenLayoutTree, and retains only that latest tree. Ordinary geometry reads may reuse it even if the page has changed. Screenshots always rebuild and replace the frozen tree. E

readme truncated — read the full docs on github

Frequently asked questions

Is moli free to use?

moli is open source under the Apache-2.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does moli do?

Best headless browser for AI agents. Lite, Fast, High-Compatibility. Built in Rust

What is moli written in?

moli is primarily written in Rust. Its source is publicly available at https://github.com/lexmount/moli, and it has 2,065 GitHub stars.