capturing-flows

capturing-flows is a skill for Claude Code, Codex from m4ttstack/fast-browser. It costs 48 tokens per session (6,534 once invoked), scanned A, original, MIT.

A browser-session recording skill that turns visible browser actions into WebM video and shareable GIF files.

In plain words
What is it for?
It helps demonstrate multi-step browser flows, record transitions and loading behavior, and share browser-based bug evidence.
Why use it?
A still screenshot cannot show the order of actions, transitions, loading states, or bugs that happen only during motion.

Skill for Claude CodeCodex

Written for Claude Code and Codex: shipped in a Claude Code plugin, but also agents/openai.yaml present. Also seen: mentions subagents.

Part of the fast-browser plugin — 7 skills, 1 agent, 1 MCP server shipped together

Good fit It helps demonstrate multi-step browser flows, record transitions and loading behavior, and share browser-based bug evidence.

Compare 6 skills from other repositories ↓
Install with agentmods
npx agentmods add skills/m4ttstack/fast-browser/capturing-flows
Install

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.

Any agent
npx skills add m4ttstack/fast-browser --skill capturing-flows
Clone the repo
git clone --depth 1 https://github.com/m4ttstack/fast-browser

Made for: Claude Code, Codex.

Or install fast-browser, the plugin that ships this one along with the rest of its 7 skills, 1 agent, 1 MCP server.

Wrote 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.

agentmods badge for capturing-flows

README.md
[![agentmods](https://agentmods.dev/badge/skills/m4ttstack/fast-browser/capturing-flows/github.svg)](https://agentmods.dev/skills/m4ttstack/fast-browser/capturing-flows)
Your own site
<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.

agentmods 80×15 button for capturing-flows

Your own site · 80×15
<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>
Per session 48 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 6,534 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

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.

ModelPer sessionOnce 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

Measured 6d ago against content hash ce4a28ea6c68, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, from the pricing page.

Security

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.

skills/capturing-flows/SKILL.md · 411 lines

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"];
}

Read the full file on GitHub · 411 lines

Files

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.

Changes

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.

  1. 6d ago Changed · +2 lines ce4a28ea6c68
  2. 19d ago Changed · +320 lines 78916d23124b
  3. 1mo ago Changed f6f7ae32bd83
  4. 1mo ago First seen · 89 lines · 48 tokens per session scan A b584da973672

Subscribe to this mod's changes

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.

Related

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…

browserbase/stagehand · 109 tokens

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…

lexmount/moli · 90 tokens

stagehand-facade

Browse, navigate, inspect, screenshot, and automate websites with the exact fx tools mcpstagehandrun, mcpstagehandsnapshot, and mcpstagehandscreenshot.

browserbase/stagehand · 42 tokens

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.

lexmount/moli · 49 tokens

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.

lexmount/moli · 74 tokens

webcmd-browser

Use when a live browser task requires Playwright interaction, authenticated handoff, visible UI verification, or ad-hoc page inspection.

agentrhq/webcmd · 30 tokens