using-lightpanda — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited using-lightpanda (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Lightpanda is a headless browser written in Zig with V8 for JavaScript and html5ever for HTML parsing. It is not a Chromium fork. It deliberately omits the entire rendering pipeline (layout, paint, compositing, GPU, font and image decoding).
Three modes of operation:
lightpanda fetch <URL> — one-shot CLI, dumps HTML or markdown to stdout.lightpanda serve — CDP WebSocket server; target for Puppeteer/Playwright.lightpanda mcp — native MCP stdio server exposing browser actions as tools.Sub-100ms cold start. ~9–11× faster and ~9–16× less memory than headless Chrome on equivalent workloads. Beta maturity — ~95% site compatibility.
goto, click,and fill over multiple steps.
markdown,structuredData, or a scoped node subtree.
Stop and use Chrome (or tell the user to) when:
PerimeterX) — Lightpanda's fingerprint is trivially detectable.
apps. Fall back rather than retrying.
getBoundingClientRect returnsmeaningless values, IntersectionObserver geometry is fake, CanvasRenderingContext2D.getImageData returns no real pixels).
LIGHTPANDA_DISABLE_TELEMETRY=true lightpanda mcpConfigure in an MCP client (e.g. Claude Desktop claude_desktop_config.json):
{
"mcpServers": {
"lightpanda": {
"command": "lightpanda",
"args": ["mcp"],
"env": { "LIGHTPANDA_DISABLE_TELEMETRY": "true" }
}
}
}LIGHTPANDA_DISABLE_TELEMETRY=true lightpanda serve --host 127.0.0.1 --port 9222Connect via puppeteer-core. See references/01-cdp-and-configuration.md for connection details, LP.* extensions, cookies, and proxies.
| Flag | Meaning | Default |
|---|---|---|
--log-level | debug, info, warn, error | info |
--http_timeout | Max HTTP transfer time in ms (0 = never) | 10000 |
--http_proxy | Proxy URL (supports basic auth inline) | — |
--proxy_bearer_token | Bearer token for Proxy-Authorization | — |
--obey-robots | Respect robots.txt | off |
--wait-until | Lifecycle event (networkidle) — fetch only | — |
--dump | html or markdown — fetch only | — |
Always set LIGHTPANDA_DISABLE_TELEMETRY=true when starting Lightpanda. Pass it as an environment variable in every invocation — serve, mcp, and fetch.
Every browser interaction follows three steps:
markdown, semantic_tree, orinteractiveElements.
goto, click(node ID), fill(node ID, value).After every goto, re-observe. Do not carry stale observations forward — the page changed.
| Tool | Purpose |
|---|---|
goto | Navigate to a URL. Specify a wait strategy. |
markdown | Page content as CommonMark. Optional target node ID for scoping. |
semantic_tree | Semantic outline with stable node IDs. |
interactiveElements | Only clickable/fillable elements with node IDs. |
structuredData | JSON-LD, OpenGraph, schema.org metadata. |
click | Click by node ID (not CSS selector). |
fill | Fill a form field by node ID. |
evaluate | Run arbitrary JS. Escape hatch for unusual cases. |
waitForSelector | Wait until a CSS selector appears. |
| Goal | Tool | Typical tokens |
|---|---|---|
| Read an article or long text | markdown | 200–800 |
| Understand page structure to plan actions | semantic_tree | 400–1200 |
| Pick an element to click or fill | interactiveElements | 100–300 |
| Extract product/article metadata | structuredData | 100–400 |
| Custom extraction not covered above | evaluate | varies |
tree unless planning to act on the page.
than semantic_tree and returns exactly the node IDs needed for action.
X and extract the table under it."
OpenGraph are richer and more reliable than DOM extraction.
semantic_tree) for long pages.A full markdown on a dense page can consume thousands of tokens.
click and fill take node IDsreturned by semantic_tree or interactiveElements — never hallucinate CSS selectors.
goto, verify expected content is present(call markdown or waitForSelector) before clicking. Networks are real, JS is async.
goto or click that triggersnavigation invalidates prior observations.
same URL, stop and trigger fallback guidance. If five consecutive tool calls fail overall, stop and report the problem. Do not loop on broken selectors or crashed pages.
interactiveElements (small) oversemantic_tree (medium) over full markdown (large). Scope to a subtree via node ID when possible.
is harder to debug and easier to get wrong.
exist. Do not attempt screenshot — the tool is absent.
node IDs from interactiveElements or semantic_tree.
page change.
structuredData when structured data is the goal.
incompatibility tail. After 3 consecutive failures on the same URL, report the issue and suggest a Chrome fallback.
When a page fails (navigation timeout, JS crash, repeated empty output, or 3 consecutive failures on the same URL):
gap, not a transient error.
Task: Navigate to a site, find and fill a search form, read results.
Tool sequence:
goto → https://example.com (wait: networkidle)interactiveElements → returns list including {id: 42, label: "Search", type: "input"} and {id: 43, label: "Submit", type: "button"}fill → node ID 42, value "headless browser"click → node ID 43markdown → returns rendered search results as CommonMarkKey points: step 2 grounds the action in real node IDs before step 3–4 attempt interaction. Step 5 re-observes after the navigation triggered by the form submission.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.