Capture Commands
Capture commands render a single page via WebKit and extract focused data without running a full disk crawl. Each command uses WebKitRuntimeCapture to load the page with JavaScript execution, then pulls the specific artifact (screenshot, SEO metadata, performance metrics, or a quick-look preview).
/speed is Free tier. /screenshot, /seo, and /preview are Core tier.
/screenshot <url>
Capture a single PNG screenshot of the fully rendered page. No disk crawl is performed.
WebKit loads the page, executes JavaScript, waits for the load event, and takes a viewport-sized screenshot. The PNG bytes are returned directly; callers decide where to persist the image.
Output
| Field | Type | Description |
|---|---|---|
png |
Data |
PNG image data of the rendered page |
finalURL |
URL |
Final URL after redirects |
CLI
crawlio cmd screenshot https://example.comMCP
{ "name": "slash_screenshot", "arguments": { "url": "https://example.com" } }Returns { png: base64, finalURL: string }.
/seo <url>
Render the page via WebKit and extract a single-page SEO report. The report covers the metadata most often checked during an audit. This is not a full SiteAnalysisManager run -- it targets one URL and returns immediately.
The DOM snapshot captured by WebKitRuntimeCapture is passed to PageSEOExtractor, which extracts structured metadata from the rendered HTML (after JS execution, so client-rendered content is included).
Output
| Field | Type | Description |
|---|---|---|
finalURL |
URL |
Final URL after redirects |
report.url |
String |
Requested URL |
report.capturedAt |
Date |
ISO 8601 timestamp |
report.title |
String? |
<title> content |
report.metaDescription |
String? |
<meta name="description"> content |
report.canonical |
String? |
<link rel="canonical"> href |
report.robotsMeta |
String? |
<meta name="robots"> content |
report.langAttr |
String? |
<html lang="..."> value |
report.h1s |
[String] |
All H1 text values |
report.h1Count |
Int |
Number of H1 elements |
report.h2Count |
Int |
Number of H2 elements |
report.headingOutline |
[String] |
Heading hierarchy (e.g. ["H1: Welcome", "H2: Pricing"]) |
report.ogTags |
{String: String} |
Open Graph tags (og:title, og:image, og:description, etc.) |
report.twitterTags |
{String: String} |
Twitter Card tags (twitter:card, twitter:title, etc.) |
report.jsonLdTypes |
[String] |
@type values from JSON-LD blocks |
report.jsonLdBlockCount |
Int |
Number of <script type="application/ld+json"> blocks |
report.hreflangs |
{String: String} |
hreflang attribute to href mapping |
report.wordCountApprox |
Int |
Approximate word count of visible text |
CLI
crawlio cmd seo https://example.comMCP
{ "name": "slash_seo", "arguments": { "url": "https://example.com" } }Returns the full PageSEOReport JSON.
/speed <url>
Render the page and extract Core Web Vitals plus page weight metrics. This is the only Free tier slash command -- a loss-leader hook into Core.
Performance observers are installed at .atDocumentStart via a WebKit user script so LCP and CLS accumulate from first paint. Network entries from PerformanceObserver are aggregated for transfer size and request counts.
Output
| Field | Type | Description |
|---|---|---|
report.url |
String |
Requested URL |
report.finalURL |
String |
Final URL after redirects |
report.capturedAt |
Date |
ISO 8601 timestamp |
report.ttfbMs |
Double? |
Time to First Byte (responseStart - requestStart) |
report.fcpMs |
Double? |
First Contentful Paint |
report.lcpMs |
Double? |
Largest Contentful Paint |
report.cls |
Double? |
Cumulative Layout Shift (dimensionless score) |
report.domContentLoadedMs |
Double? |
DOMContentLoaded event time |
report.loadEventMs |
Double? |
load event time |
report.totalTransferBytes |
Int64 |
Sum of transferSize for all resources |
report.totalDecodedBytes |
Int64 |
Sum of decodedBodySize (uncompressed) |
report.requestCount |
Int |
Total number of network requests |
report.requestsByType |
{String: Int} |
Requests grouped by resource type (e.g. {"script": 24, "img": 41}) |
Nil timing fields mean the metric was not observed (older WebKit, measurement race, or the page did not produce the event).
CLI
crawlio cmd speed https://example.comMCP
{ "name": "slash_speed", "arguments": { "url": "https://example.com" } }Returns the full PageSpeedReport JSON.
/preview <url>
Screenshot plus minimal metadata in one shot -- a quick-look command that bypasses disk crawl entirely. Returns a first-paint PNG, the page title, and the detected framework.
Internally identical to /screenshot but also extracts the <title> from the DOM snapshot and the primary framework from WebKit's runtime enrichment.
Output
| Field | Type | Description |
|---|---|---|
png |
Data |
PNG screenshot |
title |
String? |
Page <title> if present |
finalURL |
URL |
Final URL after redirects |
detectedFramework |
String? |
Primary framework (subtype preferred, e.g. "Next.js" over "React") |
capturedAt |
Date |
ISO 8601 timestamp |
A companion PreviewReport sidecar (Codable JSON) is written to disk with the same fields plus pngSizeBytes and both requestedURL / finalURL as strings.
CLI
crawlio cmd preview https://vercel.comMCP
{ "name": "slash_preview", "arguments": { "url": "https://vercel.com" } }Returns { png: base64, title: string?, finalURL: string, detectedFramework: string?, capturedAt: string }.