Borrowing it
Nothing to install: this file belongs to streamer45/streamkit. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/streamer45/streamkit/main/.agents/skills/testing-web-capture/SKILL.mdgit clone --depth 1 https://github.com/streamer45/streamkitWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/streamer45/streamkit/testing-web-capture)<a href="https://agentmods.dev/skills/streamer45/streamkit/testing-web-capture"><img src="https://agentmods.dev/badge/skills/streamer45/streamkit/testing-web-capture/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/streamer45/streamkit/testing-web-capture"><img src="https://agentmods.dev/badge/skills/streamer45/streamkit/testing-web-capture.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00048 | $0.01676 |
| Opus 5.5 | $0.00019 | $0.00670 |
| Sonnet 5.5 | $0.00010 | $0.00335 |
| Haiku 4.5 | $0.00005 | $0.00168 |
Grade A, and why
testing-web-capture scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2mo ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
- Live cast: `http://127.0.0.1:8080/cast/<target-url>` → WebM (vp9-sw). curl with `-H 'Accept: video/webm'` to grab raw stream. How it starts
The opening of the file, as written. The whole thing — 73 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Testing the web-capture gateway demo
Setup
- Go toolchain is required for the gateway (
/usr/local/go/bin/go); install from go.dev tarball if missing. - Build + deploy the servo plugin:
just build-plugin-native-servo && just copy-plugins-native.- Verify freshness:
md5sum target/plugins/release/libservo_web.so .plugins/native/servo/libservo_web.somust match and have a recent timestamp. Stale.sofiles are a known source of white frames / cross-request corruption. - skit loads plugins only at startup — restart
just skitafter copying.
- Verify freshness:
- Start backend:
just skit(127.0.0.1:4545; auth Auto disables auth on loopback, no token needed locally). - Start gateway:
cd examples/web-capture && go run ./cmd/gateway --listen :8080 --skit-url http://127.0.0.1:4545.--load-timeout-secs N/GATEWAY_LOAD_TIMEOUT_SECS(default 5) sets servo'sload_timeout_secsin both pipeline templates. It must stay below the gateway's hard-coded 8smseReadyTimeout, or cast viewers 503.- To test a non-default value, run a second gateway on another port (e.g.
--listen :8081 --load-timeout-secs 2); both can share one skit.
Endpoints
- Finite clip:
http://127.0.0.1:8080/clip/dur=20s,res=1280x720/<target-url>→ MP4 (h264-sw). - Live cast:
http://127.0.0.1:8080/cast/<target-url>→ WebM (vp9-sw). curl with-H 'Accept: video/webm'to grab raw stream. - SSRF guard blocks loopback/private targets — use public sites (streamkit.dev is dark-themed, example.com light-themed: a good high-contrast pair for leak checks).
Verifying frames (don't trust playback alone)
- Extract frames:
ffmpeg -i clip.mp4 -vf "select='eq(n,30)+eq(n,300)'" -vsync 0 f_%d.png - Live cast WebM files have no cues —
ffmpeg -ss/-sseofseeking silently returns the first frame. Extract frames withselect='eq(n,N)'full decodes instead, and beware lexicographic sorting of%d-numbered frame files. - Pixel stats with PIL: min/max grey and dark-pixel fraction distinguish blank white (min≈255), blank black/pre-paint (max≈0), and real content.
- Since the first-load gate (plugin >= 0.2.2), clips/casts should show page content from frame 0 (the node holds emission until the page is ready, capped by
load_timeout_secs, default 30s). Pre-0.2.2 builds may show all-black cold-start clips or blank lead-ins. - Since plugin >= 0.2.3, "ready" is load-complete OR ~2s after first paint — ad-heavy pages that never fire their load event no longer stall the full timeout. The gateway also caps
load_timeout_secsat 5s (GATEWAY_LOAD_TIMEOUT_SECS), so worst-case time-to-first-byte through the gateway is ~5s plus one GOP (~1s). - Some pages (e.g. streamkit.dev) may still show a single white first frame — the page's own pre-theme paint, not a gate failure.
- Testing the load-timeout expiry path via the gateway is hard: SSRF blocks local hanging servers and public "slow" endpoints (httpstat.us sleep, closed ports) fail fast rather than hang. In practice pages release via load-complete or the post-paint branch, so the expiry warn may never fire — say so rather than claiming that branch was covered.
- The gate branch that fired is visible in the skit log (plugin logs,
grep emission /tmp/skit.log):Initial page loaded; starting frame emission(load-complete),Initial page painted but load still pending after 2s; …(the >=0.2.3 post-paint branch — expect this on ad-heavy pages like cnn.com/theverge.com, ~2.2s after servo init), orPage did not finish loading within Ns; …(timeout cap).
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 2mo ago First seen · 73 lines · 48 tokens per session scan A de2bd9e68d3f
testing-web-capture is a skill published in the GitHub repository streamer45/streamkit (24 stars, last pushed 1mo ago), licensed MPL-2.0. It adds 48 tokens to every session and 1,676 once invoked, about $0.0002 per session on Opus 5.5. A static security scan graded it A with 1 finding (makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
webapp-testing
Start/reuse a local app, wait for readiness, inspect rendered state/console/network, act from observed selectors, and verify with evidence.
actionbook-web-test
Run browser-based web tests against websites using Actionbook CLI. Activate when the user wants to test a website workflow, run smoke tests, verify a user flow, check if a web application works, run regression tests, or validate browser-based interactions. Supports test definition, execution, assertion, reporting, and…
browser-testing-with-screenshots
Use when testing web applications with visual verification - automates Chrome browser interactions, element selection, and screenshot capture for confirming UI functionality.
tauri-pilot
Inspect, interact with, and test a running Tauri v2 app via CLI. Communicates over Unix socket using JSON-RPC 2.0. Use when testing UI, automating interactions, or debugging a Tauri app.
webapp-testing
Web application testing principles. E2E, Playwright, deep audit strategies.
web-test
A browser-testing tool for 1C:Enterprise, an enterprise business software platform, using Playwright to automate the web client.