# How to Build Custom Skill Bundles for claude.ai Web with Claude Video

> Learn to build custom skill bundles for claude.ai web using Claude Video. Package and upload your skills to enable custom commands like video analysis.

- Repository: [bradautomates/claude-video](https://github.com/bradautomates/claude-video)
- Tags: how-to-guide
- Published: 2026-07-26

---

**Package the `skills/watch/` directory into a `.skill` archive using [`build-skill.sh`](https://github.com/bradautomates/claude-video/blob/main/build-skill.sh) and upload it to Settings → Capabilities → Skills in the claude.ai web interface to enable the `/watch` command for video analysis.**

Claude Video is an open-source Agent Skill from the `bradautomates/claude-video` repository that adds video understanding capabilities to Claude. The skill is self-contained within the `skills/watch/` directory and can be packaged into a portable `.skill` bundle for deployment across any Claude host, including the claude.ai web platform.

## Understanding the Claude Video Skill Architecture

The skill follows a canonical contract pattern where [`SKILL.md`](https://github.com/bradautomates/claude-video/blob/main/SKILL.md) resides at the root of `skills/watch/` and references scripts relative to its own directory. This self-contained structure means the entire `watch/` folder—including the contract file and the `scripts/` runtime—can be archived and distributed as a single unit.

Key components include:

- **[`SKILL.md`](https://github.com/bradautomates/claude-video/blob/main/SKILL.md)**: Defines the `/watch` slash command metadata and entry points
- **[`scripts/watch.py`](https://github.com/bradautomates/claude-video/blob/main/scripts/watch.py)**: Orchestrates video download, frame extraction, and transcription
- **[`scripts/build-skill.sh`](https://github.com/bradautomates/claude-video/blob/main/scripts/build-skill.sh)**: Packages the skill while enforcing Claude's 200-file limit
- **[`scripts/setup.py`](https://github.com/bradautomates/claude-video/blob/main/scripts/setup.py)**: Validates runtime dependencies before execution
- **[`scripts/config.py`](https://github.com/bradautomates/claude-video/blob/main/scripts/config.py)**: Loads user-specific settings from `~/.config/watch/.env`

## Pre-Flight Dependency Checks

Before building custom skill bundles, verify your environment meets the runtime requirements. The [`scripts/setup.py`](https://github.com/bradautomates/claude-video/blob/main/scripts/setup.py) script performs a `--check` routine that validates three critical dependencies.

Run the verification:

```bash
python skills/watch/scripts/setup.py --check

```

This confirms **ffmpeg** is installed for video processing, **yt-dlp** is available for caption extraction, and a **Whisper API key** is configured for transcription fallback.

## Building the Skill Archive

The [`build-skill.sh`](https://github.com/bradautomates/claude-video/blob/main/build-skill.sh) script creates a distributable `dist/watch.skill` file containing exactly the contents of the `skills/watch/` directory. The script enforces two critical constraints: the archive must contain fewer than 200 files (Claude's limit) and must include exactly one [`SKILL.md`](https://github.com/bradautomates/claude-video/blob/main/SKILL.md) file.

Build process:

1. Ensure your working tree is clean (the script aborts on uncommitted changes)
2. Execute the build script from the repository root
3. Verify the output in `dist/watch.skill`

```bash

# Verify clean working tree

git status  # Should show "nothing to commit, working tree clean"

# Build the skill bundle

bash skills/watch/scripts/build-skill.sh

# Expected output:

# built dist/watch.skill (152 files, 1.3M)

# upload via the claude.ai skill UI

```

## Deploying to the claude.ai Web Interface

Upload the generated bundle through the claude.ai web UI to activate the `/watch` command.

1. Navigate to **Settings** → **Capabilities** → **Skills**
2. Click the **+** button to add a new skill
3. Drag `dist/watch.skill` into the upload dialog
4. Confirm "Code execution and file creation" is enabled
5. The `/watch` slash command becomes immediately available

## Running Video Analysis Commands

Once installed, invoke the skill using natural language commands:

```text
/watch https://youtu.be/dQw4w9WgXcQ what happens at the 30-second mark?

```

The [`watch.py`](https://github.com/bradautomates/claude-video/blob/main/watch.py) entry point automatically retrieves native captions via **yt-dlp** or falls back to **Whisper**, extracts frames based on the configured `--detail` mode, and streams both frames and transcript to Claude for context-aware analysis.

Configuration options in `~/.config/watch/.env` control default behaviors, including API keys and extraction modes.

## Summary

- **Self-contained packaging**: The `skills/watch/` directory includes everything needed ([`SKILL.md`](https://github.com/bradautomates/claude-video/blob/main/SKILL.md) + `scripts/`) for portable deployment across Claude hosts
- **Build validation**: [`build-skill.sh`](https://github.com/bradautomates/claude-video/blob/main/build-skill.sh) enforces the 200-file limit and generates `dist/watch.skill`
- **Dependency verification**: `setup.py --check` ensures ffmpeg, yt-dlp, and Whisper credentials are available before runtime
- **Web deployment**: Upload the `.skill` archive to claude.ai Settings → Capabilities → Skills to enable `/watch` functionality

## Frequently Asked Questions

### What is the file limit for Claude skill bundles?

Claude enforces a strict 200-file limit per skill bundle. The [`build-skill.sh`](https://github.com/bradautomates/claude-video/blob/main/build-skill.sh) script automatically validates this constraint during packaging, ensuring `dist/watch.skill` contains fewer than 200 files before generation completes.

### Can I modify the frame extraction settings in my custom bundle?

Yes. Edit [`scripts/config.py`](https://github.com/bradautomates/claude-video/blob/main/scripts/config.py) to change default detail modes or create a `~/.config/watch/.env` file with user-specific overrides. Rebuild the bundle using [`build-skill.sh`](https://github.com/bradautomates/claude-video/blob/main/build-skill.sh) after modifying any scripts to propagate changes to the web interface.

### Why does the build script require a clean git working tree?

The [`build-skill.sh`](https://github.com/bradautomates/claude-video/blob/main/build-skill.sh) script aborts if uncommitted changes are detected to ensure reproducible builds. This guarantees that the `.skill` archive reflects the exact state of the repository HEAD, preventing partial or untested code from being packaged and deployed.

### Where does the skill store API keys and configuration?

The [`scripts/config.py`](https://github.com/bradautomates/claude-video/blob/main/scripts/config.py) module loads secrets from `~/.config/watch/.env` on the local machine during development. For the claude.ai web interface, configure API keys through the skill's environment variables in the Settings panel after uploading the bundle.