Turns a YouTube video into a full content cascade: blog post + Twitter thread + LinkedIn post (+ lead-magnet post and SKFAI guide for tutorials). Fetches the transcript, generates every piece from your voice prompts, and optionally saves drafts to Supabase.
Triggers: "generate content for this video", "content cascade forβ¦", "write a blog post from my video", "run content cascade on my latest video".
Run
/onboard first. If no channel is configured, the skill suggests it before proceeding.Pipeline
- Get the video β use the URL, or for "latest" auto-detect with
yt-dlp --flat-playlist --playlist-end 1 --print url --print title "https://www.youtube.com/channel/YOUR_CHANNEL_ID/videos"and confirm the title with you. - Fetch the transcript β three methods, in order (see below).
- Extract metadata β 11-character video ID and title.
- Classify the video β tutorial (step-by-step, how-to, tool setup, code demos β generates guide + lead magnet) vs. discussion (opinions, news, trend analysis β regular LinkedIn only). You can override.
- Generate the blog post from
blog-system-prompt.mdβ shown for review. - (Optional) check for an existing post in Supabase by
youtube_video_id, then save (Supabase or local markdown). - Generate the Twitter thread β review β save; optionally post it via
post-thread.js. - Generate the LinkedIn post (mirrors the video's full premise).
- Tutorials only: LinkedIn lead-magnet post (labelled "LINKEDIN (LEAD MAGNET)") and the SKFAI guide as HTML.
- Save local copies and print a summary (titles, tweet count, video type, files, review notes).
Transcript fetch β methods in order
| # | Method | Command |
|---|---|---|
| 1 | Apify β most reliable, esp. fresh uploads (sync call, 30β60 s) | node β¦/scripts/fetch-transcript-apify.js "<url>" |
| 2 | youtube-transcript (free) | node β¦/scripts/fetch-transcript.js "<url>" |
| 3 | yt-dlp subtitles β try en-orig (original captions) first, fall back to en auto-captions | yt-dlp --write-sub --sub-lang en-orig --skip-download --sub-format json3 β¦ |
β οΈ The auto-generated
en track sometimes returns the wrong transcript for recent uploads. After any method, sanity-check the first 1β2 sentences against the video title β if they don't match, discard and try the next method. If all fail, the skill stops: "Captions aren't available yet β YouTube can take 30β60 minutes." It never proceeds without a transcript.Blog post β generated fields
| Field | Spec |
|---|---|
meta_title | under 60 chars, includes primary keyword |
meta_description | 150β160 chars, keyword + CTA |
primary_keyword / secondary_keywords | main keyword; 3β5 related terms |
slug | lowercase-hyphenated, under 60 chars |
excerpt | 1β2 sentence preview-card summary |
tags | 3β7 topic tags |
cover_image | always the YouTube thumbnail: https://i.ytimg.com/vi/VIDEO_ID/maxresdefault.jpg |
visual_assets | 5β8 real .jpg/.jpeg/.png files, each with type, source/model, path, placement after an H2/H3, alt text, caption (+ frame/timestamp for screenshots) |
content | full post in markdown, 1,500β2,500 words |
review_notes | what was cut from the transcript + any [STAT NEEDED] flags |
Long-form visual requirement
- Every long-form article includes real image files β not placeholder prose β from a strong image model (GPT Image, Higgsfield, Nous/FAL, etc.), with captions and alt text. Text-only only if explicitly requested.
- Default style: simple Anthropic-light explainer diagrams β off-white canvas, charcoal type, thin gray rules, warm clay/orange accents, plenty of whitespace, clear left-to-right or top-to-bottom flow; 0β4 short labels per image.
- When exact labels matter, render deterministic SVG/HTML/Canvas/Pillow diagrams and export to PNG instead of asking an image model to draw text.
- Use video screenshots for UI moments, demo results, before/after (with source timestamp).
- Size responsively:
width: 100%; max-width: var(--content-width); height: auto;. If image generation/extraction is blocked, stop and report the blocker rather than publish placeholders.
SKFAI guide HTML skeleton (tutorials only)
A minimal standalone HTML document (system-font stack, 800px column, styled code/pre) with the guide content inside <body> β Skool preserves HTML when pasted.
Autonomy rules
- Ask before saving β each piece is shown first; "just do everything" skips review pauses.
- Only generate the pieces you ask for (e.g. "just the blog").
- Everything saves as a draft by default β publish only on explicit request.
Supabase REST config (optional)
- Base URL
YOUR_SUPABASE_URL/rest/v1/; key inSUPABASE_SERVICE_ROLE_KEY. - Headers on every request:
apikey,Authorization: Bearer β¦,Content-Type: application/json; addPrefer: return=representationto get the row back. - Tables:
posts(id, title, slug, excerpt, content, cover_image, tags, published, published_at, youtube_video_id, meta_title, meta_description) andsocial_content(id, post_id, platform, content, status, published_at). youtube_video_idonpostshas a unique constraint β always check for an existing row first.