AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
AI‑네이티브 웹 브라우저, 처음부터 구축, Chrome보다 10배 빠르고 메모리 10배 적게
The AI-native web browser built from scratch for machines. Not a fork. Not a patch. Fast, scalable web automation with a minimal memory footprint. 10x faster, 10x less RAM, and 100x better than Chrome
개발 도구Zig · HTMLGitHub @lightpanda-io온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
Lightpanda: the headless browser designed for AI and automation
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
The headless browser built from scratch for AI agents and automation.
Not a Chromium fork. Not a WebKit patch. A new browser, written in Zig.
16x lighter and 9x faster than Chromium.
Requesting 933 real web pages over the network on a AWS EC2 m5.large instance.
See benchmark details.
Latest nightly from Arch Linux User Repository:
You can download the last binary from the nightly
builds for
Linux and MacOS for both x86_64 and aarch64.
Note: The Linux release binaries are linked against glibc. On musl-based distros (Alpine, etc.) the binary failREADME 전문 보기 ↗Requesting 933 real web pages over the network on a AWS EC2 m5.large instance. See benchmark details.
| Metric | Lightpanda | Headless Chrome | Difference |
|---|---|---|---|
| Memory (peak, 100 pages) | 123MB | 2GB | ~16x less |
| Execution time (100 pages) | 5s | 46s | ~9x faster |
Package Managers
Latest nightly from Homebrew:
brew install lightpanda-io/browser/lightpanda
Latest nightly from Arch Linux User Repository:
yay -S lightpanda-nightly-bin
Download from the nightly builds
You can download the last binary from the nightly builds for Linux and MacOS for both x86_64 and aarch64.
For Linux
curl -L -o lightpanda https://github.com/lightpanda-io/browser/releases/download/nightly/lightpanda-x86_64-linux && \
chmod a+x ./lightpanda
Verify the binary before running anything:
./lightpanda version
Linux aarch64 is also available
If you use Nix, you can run Lightpanda directly from the flake without downloading a binary:
nix run github:lightpanda-io/browser -- --help
Or pin it as an input in your own flake:
{
inputs.lightpanda.url = "github:lightpanda-io/browser";
}
Note: The Linux release binaries are linked against glibc. On musl-based Linux distributions (Alpine, etc.) the binary fails with
cannot execute: required file not foundbecause the glibc dynamic linker is missing. Use a glibc-based base image (e.g.,FROM debian:bookworm-slimorFROM ubuntu:24.04) or build from sources.Android / Termux: there is no native Android build. The Linux aarch64 binary needs the glibc loader (
/lib/ld-linux-aarch64.so.1), which Android's Bionic libc does not provide, so it fails with the samecannot execute: required file not founderror.
For MacOS
curl -L -o lightpanda https://github.com/lightpanda-io/browser/releases/download/nightly/lightpanda-aarch64-macos && \
chmod a+x ./lightpanda
MacOS x86_64 is also available
For Windows + WSL2
Lightpanda has no native Windows binary. Install it inside WSL following the Linux steps above.
WSL not installed? Run wsl --install from an administrator shell, restart, then open wsl.
See Microsoft's WSL install guide for details.
Your automation client (Puppeteer, Playwright, etc.) can run either inside WSL or on the Windows host. WSL forwards localhost:9222 automatically.
Install from Docker
Lightpanda provides official Docker
images for both Linux amd64 and
arm64 architectures.
The following command fetches the Docker image and starts a new container exposing Lightpanda's CDP server on port 9222.
docker run -d --name lightpanda -p 127.0.0.1:9222:9222 lightpanda/browser:latest
./lightpanda fetch --obey-robots --dump html --log-format pretty --log-level info https://demo-browser.lightpanda.io/campfire-commerce/
You can use --dump markdown to convert directly into markdown, or
--dump png > page.png or --dump pdf > page.pdf for a text-only rendering
of the page. --dump structured_data prints the page's JSON-LD, OpenGraph,
Twitter card, meta and link tags as JSON, like the MCP structuredData tool.
--wait-until, --wait-ms, --wait-selector and --wait-script are
available to adjust waiting time before dump.
./lightpanda serve --obey-robots --log-format pretty --log-level info --host 127.0.0.1 --port 9222
To listen on a Unix-domain socket (owner-only, mode 0600) instead of TCP:
./lightpanda serve --unix-socket /run/user/1000/lightpanda.sock
Once the CDP server started, you can run a Puppeteer script by configuring the
browserWSEndpoint.
import puppeteer from 'puppeteer-core';
// use browserWSEndpoint to pass the Lightpanda's CDP server address.
const browser = await puppeteer.connect({
browserWSEndpoint: "ws://127.0.0.1:9222",
});
// The rest of your script remains the same.
const context = await browser.createBrowserContext();
const frame = await context.newPage();
// Dump all the links from the frame.
await frame.goto('https://demo-browser.lightpanda.io/amiibo/', {waitUntil: "networkidle0"});
const links = await frame.evaluate(() => {
return Array.from(document.querySelectorAll('a')).map(row => {
return row.getAttribute('href');
});
});
console.log(links);
await frame.close();
await context.close();
await browser.disconnect();
Use --protocol webdriver to enable Bidi support.
You can start both, CDP and Bidi, with --protocol webdriver --protocol cdp
./lightpanda serve --obey-robots --log-format pretty --log-level info --host 127.0.0.1 --port 9222 --protocol webdriver
lightpanda agent lets you drive the browser with a native agent. Describe what
you want in plain English or with slash commands, and it controls the browser:
navigating pages, clicking through flows, filling forms, extracting structured
data. Think of it as a robot you're directing to use the web, more than a
chatbot you're having a conversation with.
Because the agent runs inside the same process as the browser, every tool call is a direct operation and you retain Lightpanda's speed and memory advantage.
The output of an agent session is a
PandaScript: vanilla JavaScript
with a small set of native browser primitives built directly into Lightpanda.
Run /save to export one from your current session, then replay it with
lightpanda run <script>.js. Scripts are deterministic and token-free, so
you can prototype with the LLM and ship the output to production without a
model at runtime.
It supports Anthropic, OpenAI, Gemini, Google Vertex AI, Mistral, Hugging
Face, the multi-lab gateways Vercel AI Gateway
and OpenRouter (one key for hundreds of models), any OpenAI-compatible endpoint via
OPENAI_BASE_URL, and local models via Ollama or llama.cpp. You can also run
without an LLM using --no-llm, which drops you into the REPL. See the
agent documentation for the full
reference.
./lightpanda agent # auto-detects API key from env
./lightpanda agent --task "top story on news.ycombinator.com?"
./lightpanda agent --no-llm # basic REPL, no LLM
./lightpanda run session.js # run a recorded script
cat session.js | ./lightpanda run - # ...or pipe one in via stdin
./lightpanda agent --provider gemini --task "..." # force a specific provider
./lightpanda agent --list-models # models available for the detected provider
VERTEX_API_KEY=... ./lightpanda agent --provider vertex # Vertex AI, express mode
GOOGLE_CLOUD_PROJECT=my-proj ./lightpanda agent --provider vertex # Vertex AI, token via gcloud auth
AI_GATEWAY_API_KEY=... ./lightpanda agent --provider vercel --model moonshotai/kimi-k2 # any model behind Vercel AI Gateway
OPENROUTER_API_KEY=... ./lightpanda agent --provider openrouter --model anthropic/claude-sonnet-5 # any model behind OpenRouter
OPENAI_BASE_URL=https://my-gateway/v1 OPENAI_API_KEY=... ./lightpanda agent # any OpenAI-compatible server
The MCP server communicates via MCP JSON-RPC 2.0 over stdio.
Add to your MCP configuration:
{
"mcpServers": {
"lightpanda": {
"command": "/path/to/lightpanda",
"args": ["mcp"]
}
}
}
For serving several agents from one process, start the MCP server over HTTP
instead of stdio by giving it a port (add --host x.x.x.x to specify the
interface to listen on):
lightpanda mcp --port 9223
Clients POST JSON-RPC to http://host:9223/mcp. Each connection is routed to
its own browsing session — its own page, cookies and memory — so agents no
longer clobber each other's page:
initializes without an Mcp-Session-Id header is assigned a
fresh session; the id comes back in the response's Mcp-Session-Id header.
Send it on subsequent requests to stay on that session (isolation).Mcp-Session-Id share one browsing context
(sharing — e.g. a workflow where several agents work the same page).session_new, session_list and session_close tools manage sessions
explicitly. Sending DELETE /mcp with an Mcp-Session-Id closes that session.A skill is available in lightpanda-io/agent-skill.
lightpanda completion <bash | fish | zsh> prints a completion script for commands, flags and their values:
lightpanda completion fish > ~/.config/fish/completions/lightpanda.fish
lightpanda completion bash > ~/.local/share/bash-completion/completions/lightpanda
lightpanda completion zsh > ~/.zfunc/_lightpanda # with fpath=(~/.zfunc $fpath) before compinit
By default, Lightpanda collects and sends usage telemetry. This can be disabled by setting an environment variable LIGHTPANDA_DISABLE_TELEMETRY=true. You can read Lightpanda's privacy policy at: https://lightpanda.io/privacy-policy.
Set LIGHTPANDA_DISABLE_CORE_DUMP (to any value) to suppress crash core dumps by zeroing the soft RLIMIT_CORE at startup.
Here are the key features we have implemented. For full details, see our Web Platform Tests results.
robots.txt with option --obey-robotsLightpanda is written with Zig 0.17.0. You have to
install it with the right version in order to build the project.
Lightpanda also depends on v8, Libcurl and html5ever.
To be able to build the v8 engine, you have to install some libs:
For Debian/Ubuntu based Linux:
sudo apt install xz-utils ca-certificates \
pkg-config libglib2.0-dev \
clang make curl git
You also need to install Rust.
For systems with Nix, you can use the devShell.
nix develop
For MacOS, you need cmake and Rust.
brew install cmake
You can build the entire browser with make build or make build-dev for debug
env.
But you can directly use the zig command: zig build run.
Lighpanda uses v8 snapshot. By default, it is created on startup but you can embed it by using the following commands:
Generate the snapshot.
zig build snapshot_creator -- src/snapshot.bin
Build using the snapshot binary.
zig build -Dsnapshot_path=../../snapshot.bin
See #1279 for more details.
You can test Lightpanda by running make test.
make test # Run all tests
make test F="server" # Filter by substring
TEST_FILTER="WebApi: #selector_all" make test # Filter main + subtest (separator: #)
TEST_VERBOSE=true make test
TEST_FAIL_FIRST=true make test
METRICS=true make test # Capture allocation/duration metrics as JSON
TEST_JOBS=1 make test # Run in one process (default: up to 4, or 1 when filtered)
To run end to end tests, you need to clone the demo
repository into ../demo dir.
You have to install the demo's node requirements
You also need to install Go > v1.24.
make end2end
Lightpanda is tested against the standardized Web Platform Tests.
We use a fork including a custom
testharnessreport.js. Results are published daily.
For reference, you can execute a WPT test case with your browser via wpt.live.
To run the test, you must clone the repository, configure the custom hosts and generate the
MANIFEST.json file.
Clone the repository with the fork branch.
git clone -b fork --depth=1 [email protected]:lightpanda-io/wpt.git
Enter into the wpt/ dir.
Install custom domains in your /etc/hosts
./wpt make-hosts-file | sudo tee -a /etc/hosts
Generate MANIFEST.json
./wpt manifest
Use the WPT's setup guide for details.
An external Go runner is provided by
github.com/lightpanda-io/demo/
repository, located into wptrunner/ dir.
You need to clone the project first.
First start the WPT's HTTP server from your wpt/ clone dir.
./wpt serve
Run a Lightpanda browser
zig build -Dwpt_extensions run -- serve \
--ws-max-concurrent 64 \
--insecure-disable-tls-host-verification \
--load-resources iframe \
--load-resources image \
--load-resources worker \
--load-resources stylesheet
Then you can start the wptrunner from the demo's clone dir:
cd wptrunner && go run .
Or one specific test:
cd wptrunner && go run . Node-childNodes.html
wptrunner command accepts --summary and --json options modifying output.
Also --concurrency define the concurrency limit.
To check a single test case without the runner, fetch --dump wpt prints its
results as JSON: the harness status, a pass/fail summary and the cases that
did not pass. It relies on the fork's testharnessreport.js.
zig build -Dwpt_extensions run -- fetch \
--insecure-disable-tls-host-verification \
--load-resources worker \
--load-resources iframe \
--dump wpt \
--wait-script "window.report && report.complete" \
"http://web-platform.test:8000/dom/nodes/Node-childNodes.html"
:warning: Running the whole test suite will take a long time. In this case,
it's useful to build in releaseFast mode to make tests faster.
zig build -Dwpt_extensions -Doptimize=fast run -- serve ...
See CONTRIBUTING.md for guidelines. You must sign our CLA during the pull request process.
Simple HTTP requests used to be enough for web automation. That's no longer the case. Javascript now drives most of the web:
Running a full desktop browser on a server works, but it does not scale well. Chrome at hundreds or thousands of instances is expensive:
Supporting Javascript with real performance meant building from scratch rather than forking Chromium: