Capture logo

Capture

Organization
Factory-AI
capture

Background knowledge for droid-control workflows -- not invoked directly. Recording lifecycle for terminal and browser sessions.

Overview

PublisherFactory-AI
Repositoryfactory-plugins
Skill namecapture
Stars
111
Forks
15
Bundled files
Instructions only
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.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by Factory-AI on GitHub. Read the source before you install it.

Installation

Install the 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.
  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/Factory-AI/factory-plugins.git /tmp/factory-plugins
mkdir -p .claude/skills
cp -r /tmp/factory-plugins/plugins/droid-control/skills/capture .claude/skills/capture
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

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

Capture

The orchestrator routed you here. This atom owns the full recording lifecycle: launch a target, execute an interaction script, collect raw outputs.

You should already have a driver atom loaded (terminal-use, true-input, browser-use, or desktop-use) and optionally a target atom (droid-cli). This atom layers the recording discipline on top.

Inputs

The command that invoked you should have provided:

  • Target: what to launch and on which branch(es)
  • Interaction script: the sequence of actions to perform
  • What to capture: recordings (.cast/.mp4), screenshots, text snapshots, byte sequences
  • Keystroke logging: whether to emit a keystroke TSV for later overlay

Recording lifecycle

For desktop-use, follow its recording contract; do not translate the terminal commands below into desktop commands. Routine desktop snapshots stay in the driver's observe/act/verify loop.

1. Pre-flight

Before recording anything:

  • Terminal size is consistent across all sessions (--cols 120 --rows 36)
  • Browser viewport size matches the composition layout (see "Browser viewport sizing" below) — mismatched aspects letterbox in the final video
  • Branch/worktree paths and env vars are correct
  • Recording format matches the driver: .cast for tuistory, .mp4 for true-input, screenshots for agent-browser, window PNGs / recording.mp4 for cua-driver
  • If comparing branches, both sessions use identical terminal / viewport dimensions and launch parameters
  • For droid-dev captures, --repo-root is mandatorytctl will refuse to launch without it
  • Color env vars are set (see below)

Browser viewport sizing

Panel aspect ratio in the final composition is layout-dependent. At the default 1920×1080 output with factory preset margins, the window-chrome panels that clips render into come out roughly:

LayoutPanel aspectRecommended browser viewport
single~1760×920 (≈16:9 landscape)1280×720 or 1440×810
side-by-side~872×920 per panel (≈8:9, near-square / slight portrait)960×1000, 900×1000, or 1024×1080

Feeding a 16:9 landscape recording into a near-square side-by-side panel triggers objectFit: "contain" letterboxing — you get a thin strip of content with giant black bars above and below. Two ways to avoid it:

  1. Match aspects at capture time (preferred) — pick the viewport from the table above based on the committed layout.
  2. Opt into cropping at compose time — pass "objectFit": "cover" in showcase props. Crops the edges of the clip instead of letterboxing. Use when the relevant UI is centered and the clip's edges are expendable.

If you're unsure of the layout when capturing, default to 960×1000 — it is workable in both layouts (slight horizontal letterbox in single, no letterbox in side-by-side).

bash
TCTL=${DROID_PLUGIN_ROOT}/bin/tctl
# RUN_ID and RUN_DIR should already be set by the parent (see droid-control ground rule 5)

2. Launch and record

CRITICAL: tuistory's virtual PTY does not advertise color support by default. Node.js apps (Ink/chalk) detect this and suppress ALL color escape codes, producing a monochrome recording. You must pass FORCE_COLOR=3 and COLORTERM=truecolor to force full 24-bit color output. Without these, agg has nothing to theme and the video will look grey/desaturated regardless of the agg theme chosen.

Single branch:

bash
$TCTL launch "droid-dev" -s ${RUN_ID}-demo --backend tuistory \
  --repo-root /path/to/worktree \
  --cols 120 --rows 36 --record ${RUN_DIR}/demo.cast \
  --env FORCE_COLOR=3 --env COLORTERM=truecolor

Comparison (before/after):

bash
$TCTL launch "droid-dev" -s ${RUN_ID}-before --backend tuistory \
  --repo-root /path/to/baseline-worktree \
  --cols 120 --rows 36 --record ${RUN_DIR}/before.cast \
  --env FORCE_COLOR=3 --env COLORTERM=truecolor

$TCTL launch "droid-dev" -s ${RUN_ID}-after --backend tuistory \
  --repo-root /path/to/candidate-worktree \
  --cols 120 --rows 36 --record ${RUN_DIR}/after.cast \
  --env FORCE_COLOR=3 --env COLORTERM=truecolor

Browser: size the viewport to match the composition layout (see table above).

bash
# side-by-side layout → near-square panel
agent-browser open <url> --viewport 960x1000
agent-browser record start ${RUN_DIR}/demo.webm

# single layout → 16:9 panel
agent-browser open <url> --viewport 1280x720
agent-browser record start ${RUN_DIR}/demo.webm

3. Execute the interaction script

Film for a viewer with no context. You are a director, not an operator.

  • Record before setup -- the baseline state is act 1.
  • Hold after state changes -- 2-3 seconds so text is readable. Use snapshot --trim as natural verification beats.
  • Verify between steps -- wait or snapshot to confirm state before proceeding. Don't blindly fire the next key.
  • Verification IS evidence. Capture the actual state after actions, including when no change is visible. One unchanged frame alone does not prove a frozen session or a dropped key; check the task's postcondition and timing.

For comparison recordings, both branches run identical interactions -- only the behavior differs. End both at the same script step: compose plays the longest clip in full and holds a shorter clip's final frame until it ends.

4. Keystroke logging

If the workflow requires keystroke overlay, emit a TSV file during recording. Since every interaction is scripted, the timing data is already known.

Write each keystroke's timestamp (seconds from recording start) and a human-readable label:

0.5	droid --fork
1.2	Enter
2.8	Ctrl+C
4.0	Esc

Use readable key names (Ctrl+C, not \x03). Save alongside the recording (e.g., ${RUN_DIR}/keys.tsv). Timestamps stay in raw recording seconds; compose converts them to output seconds when it sets speed, and any trim applied to the clip afterwards shifts them — trim before logging or note the offset in the handoff.

5. Close and verify raw outputs

bash
$TCTL -s "${RUN_ID}-demo" close    # terminal session owned by this run

Before handing off, confirm every expected output file exists and is non-empty:

  • Recording files (.cast, .mp4, .webm)
  • Screenshot files (.png)
  • Keystroke TSV (if committed)
  • Text snapshot logs (if needed for the report)

Evidence capture patterns

Proof typeHow to capture
Functional behaviorText snapshots: $TCTL -s <name> snapshot --trim
Visual renderingScreenshots: $TCTL -s <name> screenshot -o ${RUN_DIR}/proof-N.png
Keyboard encodingPTY bytes: ${DROID_PLUGIN_ROOT}/scripts/capture-terminal-bytes.py --backend <terminal> --combo <keys>
Web/ElectronScreenshots: agent-browser screenshot --annotate ${RUN_DIR}/proof-N.png
Native desktop GUIFollow desktop-use for exact-window or authorized desktop state and recorder ownership
Before/afterRun the same sequence on both branches at the same capture points

Outputs

Hand these to the compose stage:

## Capture outputs
- clips: [${RUN_DIR}/before.cast, ${RUN_DIR}/after.cast]      # .cast / .mp4 / .webm only
- screenshots: [${RUN_DIR}/proof-1.png, ${RUN_DIR}/proof-2.png]  # stills go to compose's screenshot path, never as clips
- keys: ${RUN_DIR}/keys.tsv (if keystroke logging was requested; raw recording seconds)
- driver: tuistory | true-input | agent-browser | cua-driver
- terminal_size: 120x36          # for tuistory / true-input
- viewport: 960x1000             # for agent-browser; report so compose knows the clip aspect

Recovery

If a session gets stuck mid-recording:

bash
$TCTL -s <name> press esc         # bail out of stuck dialog
$TCTL -s <name> snapshot --trim   # check visible state
$TCTL -s <name> close             # hard reset

For an isolated browser owned by this run: agent-browser close.

For desktop-use, reacquire state after interruption and coordinate with the recorder owner. Do not stop a shared daemon, close a personal app, or replay an uncertain input to recover a recording. Preserve partial artifacts as diagnostic evidence; label them incomplete rather than claiming they satisfy the deliverable.

Frequently asked questions

What does the Capture AI skill do?

Background knowledge for droid-control workflows -- not invoked directly. Recording lifecycle for terminal and browser sessions.

Why use Capture on TypingMind?

Because you install it once and use it with any model. 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 Capture in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/Factory-AI/factory-plugins/tree/master/plugins/droid-control/skills/capture. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use 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 Capture?

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

Is the Capture AI skill free?

It is published on GitHub by Factory-AI. 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 👇