Skip to content

Instantly share code, notes, and snippets.

@seedprod
Created January 6, 2026 16:19
Show Gist options
  • Select an option

  • Save seedprod/e6399d01d405aefa51a08fec841a871c to your computer and use it in GitHub Desktop.

Select an option

Save seedprod/e6399d01d405aefa51a08fec841a871c to your computer and use it in GitHub Desktop.
---
name: video-publish-workflow
description: Complete YouTube video publishing workflow that chains thumbnail generation, upload, transcript extraction, and content repurposing. Use when user says "publish video", "full video workflow", "upload and repurpose", or provides a video file with title for end-to-end YouTube publishing with content distribution.
---
# Video Publish Workflow
Orchestrate the complete video publishing pipeline by chaining existing skills.
## Required Inputs
| Input | Required | Description |
|-------|----------|-------------|
| Video file | Yes | Path to the video file |
| Title | Yes | Video title |
| Transcript | No | If provided, skip transcript extraction step |
| Description hints | No | Key points to emphasize in description |
## Workspace Setup
**Before starting the workflow**, create a dedicated workspace directory:
```
~/Videos/workflows/{YYYY-MM-DD}-{title-slug}/
```
Example: `~/Videos/workflows/2024-12-05-how-to-build-landing-page/`
All workflow outputs go in this directory:
```
workspace/
├── thumbnail.png # Generated thumbnail (original)
├── thumbnail.jpg # Compressed thumbnail (uploaded)
├── transcript.txt # Full transcript
├── description.txt # YouTube description
├── blog.md # Blog post draft
├── linkedin.md # LinkedIn post draft
└── tweet.md # Twitter thread draft
```
**When invoking other skills, save all outputs to the workspace directory** instead of default /tmp locations. This preserves outputs from previous workflow runs.
## Workflow Decision Tree
```
Has transcript provided?
├─ Yes → Use provided transcript
└─ No → Extract locally with local-transcribe (fast, ~10 seconds)
└─ Fallback: youtube-transcript if local fails
```
## Workflow A: Transcript Provided
Execute sequentially:
1. **Generate thumbnail** → `youtube-thumbnail-generator` skill
- Input: video title
- Output: thumbnail image (PNG)
- **Compress to JPEG <2MB** before upload (YouTube limit)
```python
from PIL import Image
img = Image.open('thumbnail.png')
img.convert('RGB').save('thumbnail.jpg', 'JPEG', quality=85, optimize=True)
```
2. **Generate description** from transcript
- Extract key points, timestamps if video >5 min
- Include hooks and CTAs
- Keep under 5000 characters
3. **Upload to YouTube** → `youtube-upload` skill
- **Use venv**: `~/.claude/skills/youtube-upload/venv/bin/python`
- Input: video file, title, description, thumbnail (compressed .jpg)
- Privacy: start with `unlisted` unless user specifies
- Output: video URL, video ID
4. **Repurpose content** → `content-repurpose` skill
- Input: transcript, video URL
- Output: blog post draft, Twitter thread, LinkedIn post
5. **Present results** to user:
- Video URL
- Content drafts for review
- Suggested next steps
## Workflow B: No Transcript (Recommended Flow)
Execute sequentially:
1. **Extract transcript locally** → `local-transcribe` skill
- **Use venv**: `~/.claude/skills/local-transcribe/venv/bin/python scripts/transcribe.py`
- Input: video file path
- **Use `--timestamps` flag** for chapter generation in description
- Output: timestamped transcript (~10 seconds for most videos)
- Save to: `workspace/transcript.txt`
- Fallback: If local transcription fails, proceed with upload and use `youtube-transcript` after
2. **Generate thumbnail** → `youtube-thumbnail-generator` skill
- Input: video title
- Output: thumbnail image (PNG)
- **Compress to JPEG <2MB** before upload (YouTube limit)
3. **Generate rich description** from transcript
- Include timestamps, key points, CTAs
- Save to: `workspace/description.txt`
4. **Upload to YouTube** → `youtube-upload` skill
- **Use venv**: `~/.claude/skills/youtube-upload/venv/bin/python`
- Input: video file, title, full description, thumbnail (compressed .jpg)
- Privacy: `unlisted` unless user specifies
- Output: video URL, video ID
5. **Repurpose content** → `content-repurpose` skill
- Input: transcript, video URL
- Output: blog post draft, Twitter thread, LinkedIn post
6. **Present results** to user
## Description Generation Guidelines
When generating video descriptions from transcript:
```
[Hook - 1-2 compelling sentences]
[Main content summary - 2-3 paragraphs]
⏱️ Timestamps:
0:00 - Intro
[Extract key sections from transcript]
🔗 Links:
[Relevant links if mentioned]
#hashtags #relevant #totopic
```
Keep descriptions:
- Under 5000 characters
- Front-loaded with important info (first 150 chars show in search)
- Include 3-5 relevant hashtags at end
## Example Usage
**User says:** "Publish this video: /path/to/video.mp4 with title 'How to Build a Landing Page in 10 Minutes'"
**Execute:**
1. Create workspace: `~/Videos/workflows/2024-12-05-how-to-build-landing-page/`
2. Extract transcript locally (~10 sec) → save to `workspace/transcript.txt`
3. Generate thumbnail → save to `workspace/thumbnail.png`, compress to `workspace/thumbnail.jpg`
4. Generate full description with timestamps → save to `workspace/description.txt`
5. Upload video as unlisted with full description and thumbnail
6. Repurpose into blog/Twitter/LinkedIn → save to `workspace/*.md`
7. Present all outputs to user with workspace path
## Skill Dependencies
This workflow requires these skills to be available:
| Skill | Purpose |
|-------|---------|
| `local-transcribe` | Extract transcript locally (primary, fast) |
| `youtube-thumbnail-generator` | Generate video thumbnail |
| `youtube-upload` | Upload video, set thumbnail, update metadata |
| `youtube-transcript` | Extract transcript from YouTube (fallback only) |
| `content-repurpose` | Create blog/Twitter/LinkedIn content |
## Error Handling
- **Local transcription fails**: Fall back to `youtube-transcript` skill after upload (will need to wait 5-10 min for YouTube processing)
- **Thumbnail generation fails**: Proceed with upload, user can set thumbnail manually
- **Upload fails**: Report error, do not proceed
- **YouTube transcript unavailable**: Wait and retry, or ask user to provide transcript
- **Repurpose fails**: Still report successful upload, note repurpose issue
## Post-Workflow
After workflow completes, present a summary:
```
Workflow Complete!
Video: https://youtu.be/{video_id}
Status: Unlisted (change to public when ready)
Workspace: ~/Videos/workflows/{date}-{slug}/
├── thumbnail.jpg ✓
├── transcript.txt ✓
├── description.txt ✓
├── blog.md ✓
├── linkedin.md ✓
└── tweet.md ✓
Next steps:
1. Review content drafts in workspace
2. Post to blog/Twitter/LinkedIn manually
3. Change video to public when ready
```
All outputs are preserved in the workspace for future reference or re-use.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment