Broll Capture logo

Broll Capture

Community
mrpaidsocial
broll-capture

Capture website B-roll and screenshots for a video edit: full-page screenshots of real pages (for shot-cards and "proof" beats), smooth scripted-scroll screen recordings, and high-fidelity Screen Studio recordings of the user's real browser for sites that block automation. Use whenever an edit needs real screenshots, a screen recording of a website/app, "capture the site", or B-roll of a product. NOT for generating graphics (branded-ad-edit cards) or editing footage.

Overview

Publishermrpaidsocial
Repositorymrpaidsocial-video-editor-agent
Skill namebroll-capture
Stars
114
Forks
34
Bundled files
1
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 1 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by mrpaidsocial on GitHub. Read the source before you install it.

Installation

Install the Broll Capture AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/mrpaidsocial/mrpaidsocial-video-editor-agent/tree/main/.claude/skills/broll-capture
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/mrpaidsocial/mrpaidsocial-video-editor-agent.git /tmp/mrpaidsocial-video-editor-agent
mkdir -p .claude/skills
cp -r /tmp/mrpaidsocial-video-editor-agent/.claude/skills/broll-capture .claude/skills/broll-capture
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Broll Capture in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Broll Capture on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Broll Capture is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

B-roll & Screenshot Capture

Three lanes, in order of effort. Real captures read as proof; recreations read as ads — always prefer capturing the actual site.

Every capture, whatever the lane, ends the same way: re-encode with dense keyframes (-g 30 -keyint_min 30) so seeks don't freeze in the renderer, then frame-extract and LOOK at every take before using it.


Lane A — Full-page screenshots (shot-cards, docs, blog "proof" beats)

A1. Playwright MCP (zero code — use it if the client has it connected)

If the Claude Code session has a Playwright (or browser) MCP available: navigate to the URL, wait for load, take a full-page screenshot, save it into assets/shots/. Good enough for most shot-cards. Take at the largest viewport available and capture more height than you need — crop later.

A2. Scripted (bundled): scripts/capture-shots.mjs

Puppeteer script — edit the TARGETS list (name, url, capture height) and run node scripts/capture-shots.mjs. What it encodes:

  • Real desktop UA + 1440×900 viewport at deviceScaleFactor: 2 (crisp 2x shots).
  • A widget killer injected twice (cookie/consent/chat/intercom/banner/dialog selectors hidden with display:none !important) — once after load, once after the scroll pass, because chat widgets re-mount.
  • A lazy-load scroll pass (step to the bottom, settle, back to top) so images and deferred sections are actually painted before the shot.
  • Clipped full-page screenshot (clip to the min of wanted height vs body height).

Review every PNG. Common junk that survives: keychain popups (from a Chrome-for-Testing profile — use system Chrome + a fresh userDataDir + ignoreDefaultArgs:["--enable-automation"]), region banners, half-loaded heroes.


Lane B — Scripted scroll recordings (clean site B-roll, 3–6s clips)

The branded-ad-edit skill's references/design.md §3 carries the full recipe: kiosk system-Chrome, scripted eased scrolling (never native jerky scroll), recorded or screencast, cut into 3–6s clips. Key gotchas:

  • Scroll the smallest matching node — a text anchor can match an ancestor div whose scrollTop never moves (the scroll silently no-ops).
  • Sweep junk selectors on an interval during the take.
  • Frame-extract-review EVERY take.

Lane C — Screen Studio / real-browser recording (highest fidelity, or when automation is blocked)

Some sites (Cloudflare and friends) block kiosk/fresh-profile Chrome outright. The proven fallback: record the user's REAL logged-in browser.

  1. Drive the real browser — a browser-extension MCP (e.g. claude-in-chrome) or the user by hand — through scripted, eased scrolls of each target page.
  2. Sync markers: flash the page pure white for ~0.3s before each take (document.body.style.filter or an injected overlay). Markers make take boundaries findable in one pass.
  3. Record the display with Screen Studio (screenstudio-cli if installed — check screenstudio --help) or any screen recorder. Screen Studio's polish (smooth cursor, auto-zoom) is why it's worth using when available.
  4. Find the markers afterwards: invert the video and run black-frame detection — ffmpeg -i cap.mp4 -vf "negate,blackdetect=d=0.1:pix_th=0.10" -f null - — each detected "black" run is a white flash; cut takes between markers.
  5. Crop off the chrome: browser toolbar and the Dock/menu bar must go — e.g. a 1920×1080 display capture cropping to 1920×816 at y=176 keeps only the page. Compute your crop from a test frame, verify by eye.
  6. Re-encode dense keyframes; clip into 3–6s beats.

Traps learned the hard way

  • CDP on :9222 may not be the user's browser. Screen Studio runs its own embedded Chromium that can occupy the debug port (UA ScreenStudio/…, Target.createTarget unsupported). If an automation script suddenly sees a logged-out web, check WHOSE browser it attached to.
  • Inner-container scroll areas (docs sites) often defeat page-level scrolling — takes come out static. Target the container, or skip that page.
  • Never enter credentials for the user; if a login wall appears, hand the browser to them and resume after.

Lane D — Public social posts and reaction GIFs without a login (2026-09-28)

  • X posts render through the public embed page https://platform.twitter.com/embed/Tweet.html?dnt=true&id=<id>&lang=en&theme=light&hideThread=true (Puppeteer, 420 px viewport, device scale 2 so the text wraps large enough for a phone). Clip from the User-Name row to the first tweetText (the last one is a quoted post). Triage a post before capturing it with https://cdn.syndication.twimg.com/tweet-result?id=<id>&token=a: text, likes, the parent post, photos[] urls and video.variants[] (pick the highest bitrate; portrait 1080×1920 variants exist for phone-shot posts and drop straight in as takeovers).
  • Reaction GIFs: GIPHY's published beta key is banned and Tenor's API is discontinued. giphy.com's own search calls api.giphy.com/v1/gifs/search with a key visible in its page requests; read it from a headless page (page.on("request")) and search from there (rating pg-13), then loop the mp4 to the beat with -stream_loop. Prefer brand-, artist- and creator-made loops over film and TV frames, and check the loop's last frame for a channel watermark before using it.
  • Scroll recordings: when Playwright's browser is missing, Puppeteer's page.screencast() at a 540×960 viewport with device scale 2 gives a clean 30 fps portrait recording; re-encode with a dense GOP before the comp.

Where captures go

assets/shots/*.png for stills, media/broll/*.mp4 for clips. In compositions, stills usually display as a sharp card floating over a blurred blow-up of itself, or inside a browser-chrome frame (see branded-ad-edit references/design.md).

More traps (profile captures, 2026-09)

  • A TypeScript runner can poison page.evaluate. tsx/esbuild injects a __name helper into any function it serialises; inside the page that helper does not exist and the evaluate throws __name is not defined. Pass page scripts as strings, not functions.
  • Some platforms never render their grid for automation (TikTok: "Something went wrong", survives Refresh clicks and long waits). The profile header still renders — take the still, and carry the scrolling beat with another platform's grid.
  • A screencast that "worked" can be static. Instagram's grid lives in an inner scroll container; page-level scrollTo no-ops and every frame is identical. Frame-tile every take before using it — the tile is how this was caught.
  • Check the handle before blaming the tool. Two 404s were a handle mismatch (the creator's handle differs by a dot between platforms), not blocking.
  • An authenticated dashboard capture can violate a client rule. An Ads Manager screenshot shows real account IDs and campaign names; treat it as unusable unless cropped to chrome.

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Broll Capture AI skill do?

Capture website B-roll and screenshots for a video edit: full-page screenshots of real pages (for shot-cards and "proof" beats), smooth scripted-scroll screen recordings, and high-fidelity Screen Studio recordings of the user's real browser for sites that block automation. Use whenever an edit needs real screenshots, a screen recording of a website/app, "capture the site", or B-roll of a product. NOT for generating graphics (branded-ad-edit cards) or editing footage.

Why use Broll Capture on TypingMind?

Because you install it once and use it with any model. Broll Capture is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Broll Capture in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/mrpaidsocial/mrpaidsocial-video-editor-agent/tree/main/.claude/skills/broll-capture. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Broll Capture?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Broll Capture?

As many as you like. As long as a model supports skills, you can use Broll Capture with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Broll Capture AI skill free?

It is published on GitHub by mrpaidsocial. Check the repository for licensing terms. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇