Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add m4ttstack/fast-browser --skill capturing-flowsgit clone --depth 1 https://github.com/m4ttstack/fast-browserWrote 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/m4ttstack/fast-browser/capturing-flows)<a href="https://agentmods.dev/skills/m4ttstack/fast-browser/capturing-flows"><img src="https://agentmods.dev/badge/skills/m4ttstack/fast-browser/capturing-flows/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/m4ttstack/fast-browser/capturing-flows"><img src="https://agentmods.dev/badge/skills/m4ttstack/fast-browser/capturing-flows.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.06534 |
| Opus 5.5 | $0.00019 | $0.02614 |
| Sonnet 5.5 | $0.00010 | $0.01307 |
| Haiku 4.5 | $0.00005 | $0.00653 |
Grade A, and why
capturing-flows scanned grade A with 0 findings 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 6d 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.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 411 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Capturing Flows
A recording shows what a screenshot cannot: the order things happened in.
Fast Browser records the browser session it drives to WebM and converts the
result to shareable GIFs with fast-browser gif.
Walk the graph; each box has its section below. A move the graph does not show goes through its off-script gate.
Which sessions record
Recording covers the session Fast Browser drives: the real Chrome tabs attached through the extension relay, the ordinary connected setup. Only the tabs Fast Browser controls are recorded. Other tabs, windows, and profiles stay untouched, and the fast-browsing browser boundaries hold unchanged; there is no separate isolated browser to record in. Because the recording is of the user's real Chrome, everything visible in the driven tab lands in the file, which is why the PII rule below matters in practice, not in theory.
The capture graph
digraph capture_flow {
rankdir=TB;
"Trigger: motion is the evidence" [shape=ellipse];
"Recording attempts >= 3?" [shape=diamond];
"Recording on since before this session started?" [shape=diamond];
"fast-browser configure --video 1280x720" [shape=plaintext];
"configure result?" [shape=diamond];
"Ask the human to restart the Fast Browser session" [shape=box];
"Restart answer?" [shape=diamond];
"browser_tabs {action: new, url: <where the flow starts>}" [shape=plaintext];
"Drive exactly the one flow being shown" [shape=box];
"Recorded flow result?" [shape=diamond];
"STOP: never log in for the user" [shape=octagon style=filled fillcolor=red fontcolor=white];
"STOP: never collect from an open tab" [shape=octagon style=filled fillcolor=red fontcolor=white];
"Ask the human to log in in Chrome" [shape=box];
"Login answer?" [shape=diamond];
"browser_tabs {action: close}: the broken recording" [shape=plaintext];
"browser_tabs {action: close}: the finished recording" [shape=plaintext];
"ls -t ~/.fast-browser/output/videos/*.webm" [shape=plaintext];
"Newest .webm is this flow's, complete?" [shape=diamond];
"fast-browser gif <name>.webm --fps <8 first> --width <800 first>" [shape=plaintext];
"gif result?" [shape=diamond];
"Installed ffmpeg once already?" [shape=diamond];
"brew install ffmpeg" [shape=plaintext];
"fast-browser doctor" [shape=plaintext];
"Bare name used already?" [shape=diamond];
"Use the bare name inside the videos directory" [shape=box];
"Watch the output GIF yourself" [shape=box];
"What does the GIF show?" [shape=diamond];
"Conversions >= 3?" [shape=diamond];
"How to keep the PII out?" [shape=diamond];
"STOP: never deliver motion evidence containing PII" [shape=octagon style=filled fillcolor=red fontcolor=white];
"Capture annotated stills with annotating-screenshots" [shape=box];
"Deliver the stills, saying why" [shape=box];
"Deliver the GIF" [shape=box];
"Off-script gate: recording attempts spent" [shape=box];
"Make the approved move once: recording attempts spent" [shape=box];
"Off-script rounds = 2: recording attempts spent?" [shape=diamond];
"Off-script gate: configure refused the video setting" [shape=box];
"Make the approved move once: configure refused" [shape=box];
"Off-script rounds = 2: configure refused?" [shape=diamond];
"Off-script gate: ffmpeg still missing" [shape=box];
"Make the approved move once: ffmpeg still missing" [shape=box];
"Off-script rounds = 2: ffmpeg still missing?" [shape=diamond];
"Off-script gate: gif refuses the name" [shape=box];
"Make the approved move once: gif refuses the name" [shape=box];
"Off-script rounds = 2: gif refuses the name?" [shape=diamond];
"Off-script gate: GIF still too heavy" [shape=box];
"Make the approved move once: GIF still too heavy" [shape=box];
"Off-script rounds = 2: GIF still too heavy?" [shape=diamond];
"Held: nothing moved" [shape=doublecircle];
"Handed back with what is done" [shape=doublecircle];
"Stills delivered instead of motion" [shape=doublecircle];
"GIF delivered" [shape=doublecircle style=filled fillcolor=lightgreen];
"Trigger: motion is the evidence" -> "Recording attempts >= 3?";
"Recording attempts >= 3?" -> "Recording on since before this session started?" [label="no"];
"Recording attempts >= 3?" -> "Off-script gate: recording attempts spent" [label="yes: budget spent"];
"Recording on since before this session started?" -> "browser_tabs {action: new, url: <where the flow starts>}" [label="yes"];
"Recording on since before this session started?" -> "fast-browser configure --video 1280x720" [label="no, or unsure"];
"fast-browser configure --video 1280x720" -> "configure result?";
"configure result?" -> "Ask the human to restart the Fast Browser session" [label="set"];
"configure result?" -> "Off-script gate: configure refused the video setting" [label="the command errored"];
"Ask the human to restart the Fast Browser session" -> "Restart answer?";
"Restart answer?" -> "browser_tabs {action: new, url: <where the flow starts>}" [label="restarted"];
"Restart answer?" -> "Handed back with what is done" [label="will not restart"];
"browser_tabs {action: new, url: <where the flow starts>}" -> "Drive exactly the one flow being shown";
"Drive exactly the one flow being shown" -> "Recorded flow result?";
"Recorded flow result?" -> "browser_tabs {action: close}: the finished recording" [label="done"];
"Recorded flow result?" -> "browser_tabs {action: close}: the broken recording" [label="broke midway"];
"Recorded flow result?" -> "Ask the human to log in in Chrome" [label="a login screen"];
"Recorded flow result?" -> "STOP: never log in for the user" [label="tempted to log in yourself"];
"Recorded flow result?" -> "STOP: never collect from an open tab" [label="tempted to collect from the open tab"];
"STOP: never log in for the user" -> "Ask the human to log in in Chrome";
"STOP: never collect from an open tab" -> "browser_tabs {action: close}: the finished recording";
"Ask the human to log in in Chrome" -> "Login answer?";
"Login answer?" -> "browser_tabs {action: close}: the broken recording" [label="signed in: re-record clean"];
"Login answer?" -> "Handed back with what is done" [label="will not sign in"];
"Login answer?" -> "STOP: never log in for the user" [label="tempted to type the password they pasted"];
"browser_tabs {action: close}: the broken recording" -> "Recording attempts >= 3?";
"browser_tabs {action: close}: the finished recording" -> "ls -t ~/.fast-browser/output/videos/*.webm";
"ls -t ~/.fast-browser/output/videos/*.webm" -> "Newest .webm is this flow's, complete?";
"Newest .webm is this flow's, complete?" -> "fast-browser gif <name>.webm --fps <8 first> --width <800 first>" [label="yes"];
"Newest .webm is this flow's, complete?" -> "Recording attempts >= 3?" [label="none appeared, or tiny or unreadable"];
"fast-browser gif <name>.webm --fps <8 first> --width <800 first>" -> "gif result?";
"gif result?" -> "Watch the output GIF yourself" [label="ok"];
"gif result?" -> "Installed ffmpeg once already?" [label="ffmpeg missing"];
"gif result?" -> "Bare name used already?" [label="refused the name"];
"Installed ffmpeg once already?" -> "brew install ffmpeg" [label="no"];
"Installed ffmpeg once already?" -> "Off-script gate: ffmpeg still missing" [label="yes"];
"brew install ffmpeg" -> "fast-browser doctor";
"fast-browser doctor" -> "fast-browser gif <name>.webm --fps <8 first> --width <800 first>";
"Bare name used already?" -> "Use the bare name inside the videos directory" [label="no"];
"Bare name used already?" -> "Off-script gate: gif refuses the name" [label="yes"];
"Use the bare name inside the videos directory" -> "fast-browser gif <name>.webm --fps <8 first> --width <800 first>";
"Watch the output GIF yourself" -> "What does the GIF show?";
"What does the GIF show?" -> "Deliver the GIF" [label="the whole flow, clean, sane size"];
"What does the GIF show?" -> "Conversions >= 3?" [label="too heavy"];
"What does the GIF show?" -> "Recording attempts >= 3?" [label="part of the flow missing"];
"What does the GIF show?" -> "How to keep the PII out?" [label="PII in a frame"];
"What does the GIF show?" -> "STOP: never deliver motion evidence containing PII" [label="tempted to deliver it anyway"];
"STOP: never deliver motion evidence containing PII" -> "How to keep the PII out?";
"Conversions >= 3?" -> "fast-browser gif <name>.webm --fps <8 first> --width <800 first>" [label="no: lower fps or width"];
"Conversions >= 3?" -> "Off-script gate: GIF still too heavy" [label="yes"];
"How to keep the PII out?" -> "Recording attempts >= 3?" [label="a cleaner re-record"];
"How to keep the PII out?" -> "Capture annotated stills with annotating-screenshots" [label="annotated stills"];
"Capture annotated stills with annotating-screenshots" -> "Deliver the stills, saying why";
"Deliver the stills, saying why" -> "Stills delivered instead of motion";
"Deliver the GIF" -> "GIF delivered";
"Off-script gate: recording attempts spent" -> "Make the approved move once: recording attempts spent" [label="take: one more recording"];
"Off-script gate: recording attempts spent" -> "Off-script rounds = 2: recording attempts spent?" [label="iterate: the human fixed the cause"];
"Off-script gate: recording attempts spent" -> "Held: nothing moved" [label="hold"];
"Off-script gate: recording attempts spent" -> "Handed back with what is done" [label="hand back"];
"Make the approved move once: recording attempts spent" -> "browser_tabs {action: new, url: <where the flow starts>}";
"Off-script rounds = 2: recording attempts spent?" -> "Recording on since before this session started?" [label="no: record again"];
"Off-script rounds = 2: recording attempts spent?" -> "Handed back with what is done" [label="yes"];
"Off-script gate: configure refused the video setting" -> "Make the approved move once: configure refused" [label="take: the human set it"];
"Off-script gate: configure refused the video setting" -> "Off-script rounds = 2: configure refused?" [label="iterate: the human fixed the cause"];
"Off-script gate: configure refused the video setting" -> "Held: nothing moved" [label="hold"];
"Off-script gate: configure refused the video setting" -> "Handed back with what is done" [label="hand back"];
"Make the approved move once: configure refused" -> "Ask the human to restart the Fast Browser session";
"Off-script rounds = 2: configure refused?" -> "fast-browser configure --video 1280x720" [label="no: configure again"];
"Off-script rounds = 2: configure refused?" -> "Handed back with what is done" [label="yes"];
"Off-script gate: ffmpeg still missing" -> "Make the approved move once: ffmpeg still missing" [label="take: the human's install"];
"Off-script gate: ffmpeg still missing" -> "Off-script rounds = 2: ffmpeg still missing?" [label="iterate: the human fixed the cause"];
"Off-script gate: ffmpeg still missing" -> "Held: nothing moved" [label="hold"];
"Off-script gate: ffmpeg still missing" -> "Handed back with what is done" [label="hand back"];
"Make the approved move once: ffmpeg still missing" -> "fast-browser gif <name>.webm --fps <8 first> --width <800 first>";
"Off-script rounds = 2: ffmpeg still missing?" -> "fast-browser doctor" [label="no: confirm, then convert"];
"Off-script rounds = 2: ffmpeg still missing?" -> "Handed back with what is done" [label="yes"];
"Off-script gate: gif refuses the name" -> "Make the approved move once: gif refuses the name" [label="take: the human's name"];
"Off-script gate: gif refuses the name" -> "Off-script rounds = 2: gif refuses the name?" [label="iterate: the human fixed the cause"];
"Off-script gate: gif refuses the name" -> "Held: nothing moved" [label="hold"];
"Off-script gate: gif refuses the name" -> "Handed back with what is done" [label="hand back"];
"Make the approved move once: gif refuses the name" -> "fast-browser gif <name>.webm --fps <8 first> --width <800 first>";
"Off-script rounds = 2: gif refuses the name?" -> "Use the bare name inside the videos directory" [label="no: convert again"];
"Off-script rounds = 2: gif refuses the name?" -> "Handed back with what is done" [label="yes"];
"Off-script gate: GIF still too heavy" -> "Make the approved move once: GIF still too heavy" [label="take: the human accepts the size"];
"Off-script gate: GIF still too heavy" -> "Off-script rounds = 2: GIF still too heavy?" [label="iterate: the human set new limits"];
"Off-script gate: GIF still too heavy" -> "Held: nothing moved" [label="hold"];
"Off-script gate: GIF still too heavy" -> "Handed back with what is done" [label="hand back"];
"Make the approved move once: GIF still too heavy" -> "Deliver the GIF";
"Off-script rounds = 2: GIF still too heavy?" -> "fast-browser gif <name>.webm --fps <8 first> --width <800 first>" [label="no: convert again"];
"Off-script rounds = 2: GIF still too heavy?" -> "Handed back with what is done" [label="yes"];
}
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
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.
- 6d ago Changed · +2 lines ce4a28ea6c68
- 19d ago Changed · +320 lines 78916d23124b
- 1mo ago Changed f6f7ae32bd83
- 1mo ago First seen · 89 lines · 48 tokens per session scan A b584da973672
capturing-flows is a skill published in the GitHub repository m4ttstack/fast-browser (0 stars, last pushed today), licensed MIT. It adds 48 tokens to every session and 6,534 once invoked, about $0.0002 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
browse
Use the browse CLI for Browserbase browser automation, Browserbase cloud APIs, Browserbase Functions, templates, web fetch/search, diagnostics, and Browse.sh skill discovery/installation. Use when the user asks to navigate pages, inspect browser state, run local or remote browser sessions, manage Browserbase…
moli-webfetch
Fetch, inspect, crawl, and capture live, JavaScript-rendered websites with Moli. Use when Codex needs current web content, web research, fact lookup, link following, a bounded crawl, client-rendered or response-gated content, network diagnostics, or a standalone HTML, Markdown, JSON, semantic-tree, viewport or…
stagehand-facade
Browse, navigate, inspect, screenshot, and automate websites with the exact fx tools mcpstagehandrun, mcpstagehandsnapshot, and mcpstagehandscreenshot.
moli-websearch
Search the web by keyword or reverse-search images with Moli to find subjects, sources, exact matches, or similar images—even when Moli is not named. For fetching a known URL, use moli-webfetch.
moli-cdp-server
Start Moli's CDP server and connect Playwright, Puppeteer, or raw CDP clients. Use to run a headless-browser CDP endpoint, replace a Chromium process, attach over CDP, enable real layout and screenshot surfaces, or diagnose CDP discovery, connection, and target startup—even when Moli is not named.
webcmd-browser
Use when a live browser task requires Playwright interaction, authenticated handoff, visible UI verification, or ad-hoc page inspection.