page-renderer
The page-renderer tool visits a single URL in a real headless browser (Chrome DevTools Protocol via chromedp/Chromium) and captures either the rendered HTML or a full-page screenshot. Unlike a plain HTTP fetch, it executes JavaScript exactly as a real browser would, so it can visit authenticated dashboards, SPAs, and JS-heavy pages behind a loaded cookie jar rather than just their raw server response. It does not crawl or follow links beyond redirects — one visit per input line, then it exits.
Ideal Use Cases & Fit
This tool is well suited for capturing what a real, authenticated user would actually see: replaying a session's cookies to render an internal dashboard or SaaS admin panel, taking evidence screenshots of a phishing page or suspected C2 panel for a threat report, or verifying a redirect chain / login flow before automating further steps against it. It excels wherever the raw HTML response wouldn't tell the full story — client-side redirects, SPA auth checks, or content that only appears after JavaScript runs. It is not the right tool for multi-page crawling or link discovery (that's web-scraper's job), and JS-heavy pages that redirect asynchronously (e.g. after an auth-check API call) need a large enough wait value or the capture can land before the page finishes settling.
Value in Workflows
In security workflows, page-renderer is most valuable as a verification or evidence-capture step: confirming that a set of session cookies actually authenticates against a target application, rendering a flagged URL for visual triage during incident response, or producing a screenshot to attach to a report without a human having to open the link themselves. Because it can take structured input (cookies, headers, and settings) from an upstream node in one combined file, it also fits cleanly after a credential-harvesting or session-extraction step earlier in a workflow, turning raw session data directly into a rendered result. Its output is one JSON object per input line, so downstream nodes can consume either the HTML content or the base64-encoded screenshot without extra parsing.
Input Data
The tool accepts a single input file in one of two shapes:
- Plain text: a newline-separated list of URLs (scheme optional;
example.comis treated ashttps://example.com). - Structured JSON: an object carrying targets plus cookies, headers, and any other setting together, for when a single upstream node needs to hand off everything in one file. Only
targetsis required; unknown keys are ignored.
Example (structured JSON):
{
"targets": ["https://example.com/dashboard"],
"cookies": [{"name": "session", "value": "abc123"}],
"headers": {"Authorization": "Bearer eyJhbGci..."},
"mode": "screenshot"
}
Cookie entries only require name/value — anything else omitted (domain, path, secure, httpOnly, expires) is defaulted sensibly: domain falls back to the target's own host, secure matches the target's scheme, and expiry is set a year out so nothing expires mid-run.
Configuration
- cookies: JSON cookie array, either inline or a path to a file containing it. Only
name/valueare required per entry. Applied fresh before every target. Takes precedence over acookieskey in the input file. - headers: Extra HTTP headers, either inline or a path to a file: a JSON object (
{"Header-Name":"value"}) or an array of{name,value}objects. Takes precedence over aheaderskey in the input file. - mode: Capture mode —
html(rendered outer HTML) orscreenshot(PNG, base64-encoded in the output). Defaulthtml. - full-page: Screenshot mode only. Captures the full scrollable page. If
false(default), captures just the visible viewport. - follow-redirects: Follow HTTP redirects. If
false, stops at the first redirect and reports itsLocationinstead of continuing (status becomesredirect_blocked). Defaulttrue. - timeout: Navigation timeout in seconds, per target. Default
30. - wait: Extra time to wait after
loadfires, in milliseconds — needed for JS-heavy pages that fetch data or redirect asynchronously after their initial load. Default0. - user-agent: Custom User-Agent header. Also suppresses
Sec-CH-UA*client hint headers so they don't contradict it by still reporting the real browser. - viewport-width / viewport-height: Browser viewport size in pixels. Defaults
1920/1080. - insecure: Skip TLS certificate verification, for internal targets with self-signed certs. Default
false. - output: One JSON object per input line (JSONL) —
url,final_url,status(success/redirect_blocked/error),status_code,redirect_chainwhen applicable, and eitherhtmlorscreenshot_base64depending onmode.