[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71KA8TDC0M8SGB97MBGGNFZ":3,"skill-same:01M71KA8TDC0M8SGB97MBGGNFZ":108},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":49,"ownerHtmlUrl":50,"ownerBlogUrl":51,"ownerDescription":52,"updatedAt":53,"install":54,"resources":67},"01M71KA8TDC0M8SGB97MBGGNFZ","podcast-marketing",null,"Repurpose podcast episodes into social posts, show notes, clips, and quote cards.","clawdsolana\u002FOpenClawd","clawdsolana","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F279036008?v=4","01M71JTVF9FNGKE2SVJRPTQM31","OpenClawd","01M71JTVGCKWBSS8ZYC1HYWVA5",2,"MIT","https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fsecondary_skills\u002Fpodcast-marketing\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000019","营销推广","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000035","市场营销","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38],"marketing","podcast marketing","podcast","posts","show","social","notes","cards","quote","repurpose","2026-11-10 10:12:30",false,"---\nname: podcast-marketing\ndescription: Repurpose podcast episodes into social posts, show notes, clips, and quote cards.\n---\n\n# Podcast Marketing\n\n## OpenClawd Operator Adaptation\n\nRun this skill as part of the OpenClawd operator deck. Preserve the skill-specific workflow below, but frame outputs for Solana-native agents when relevant: prefer OpenClawd language, note whether the work can support autonomous agent operations, and keep financial, legal, tax, hiring, medical, or other regulated outputs informational unless the skill already requires a stricter disclaimer. Use the Llobster Legend persona only as light operator framing; do not let branding override accuracy, safety, or the user's stated domain.\n\n\nTurn podcast episodes into a full suite of marketing content. Supports four input modes, extracts content atoms with viral scoring, and produces platform-ready content pieces that can be published immediately.\n\n## Requirements & Setup\n\n### Tier 1: Text Content (always needed)\n\nThese are required for transcript extraction and content generation (show notes, blog, social, newsletter, pull quotes):\n\n| Dependency | Install | Purpose |\n\n|-----------|---------|---------|\n\n| Python 3.10+ | `installProgrammingLanguage({ language: \"python-3.11\" })` | Runtime for all scripts |\n\n| youtube-transcript-api | `installLanguagePackages({ language: \"python\", packages: [\"youtube-transcript-api\"] })` | YouTube caption extraction |\n\n| yt-dlp | `installLanguagePackages({ language: \"python\", packages: [\"yt-dlp\"] })` | YouTube metadata + video\u002Faudio download |\n\n| LLM API | Set up via Anthropic or OpenAI AI integration (Replit proxy — no user API key needed) | Content atom extraction and content generation |\n\n### Tier 2: Quote Card Images\n\nThese are required to generate visual quote card PNG files:\n\n| Dependency | Install | Purpose |\n\n|-----------|---------|---------|\n\n| Pillow | `installLanguagePackages({ language: \"python\", packages: [\"Pillow\"] })` | Image generation |\n\n| System fonts | Already available on Nix (DejaVu Sans at `\u002Fusr\u002Fshare\u002Ffonts\u002Ftruetype\u002Fdejavu\u002F`) | Typography |\n\nNo API keys needed. Run `scripts\u002Fgenerate_quote_cards.py` directly.\n\n### Tier 3: Short-Form Video Clips (basic)\n\nThese produce trimmed, vertical-reformatted video clips without animated captions:\n\n| Dependency | Install | Purpose |\n\n|-----------|---------|---------|\n\n| ffmpeg | `installSystemDependencies({ packages: [\"ffmpeg\"] })` | Video trimming, reformatting, subtitle burning |\n\n| yt-dlp | (already in Tier 1) | Download source video from YouTube |\n\n### Tier 4: Animated Captions (Opus Clips style)\n\nThese add word-by-word highlighted captions to video clips:\n\n| Dependency | Install | Purpose |\n\n|-----------|---------|---------|\n\n| OpenAI API | Set up OpenAI AI integration OR user provides `OPENAI_API_KEY` | Whisper word-level timestamps |\n\n| Pillow | (already in Tier 2) | Caption frame generation (alternative to ASS subtitles) |\n\nThe animated caption pipeline re-transcribes each trimmed clip through Whisper with `timestamp_granularities=[\"word\"]` to get per-word timing. Without this, clips still work but use segment-level static captions instead.\n\n### Setup Checklist\n\nBefore running the pipeline, verify:\n\n```python\n\n# Tier 1\n\nimport youtube_transcript_api \\# YouTube captions\n\nimport yt_dlp \\# YouTube metadata\u002Fdownload\n\nimport anthropic \\# or openai — for content generation\n\n# Tier 2 (if generating quote cards)\n\nfrom PIL import Image, ImageFont\n\nImageFont.truetype(\"\u002Fusr\u002Fshare\u002Ffonts\u002Ftruetype\u002Fdejavu\u002FDejaVuSans-Bold.ttf\", 48)\n\n# Tier 3 (if generating video clips)\n\nimport subprocess\n\nsubprocess.run([\"ffmpeg\", \"-version\"], capture_output=True, check=True)\n\n# Tier 4 (if generating animated captions)\n\nimport openai \\# OPENAI_API_KEY must be set\n\n```\n\n## When to Use\n\n- User wants to repurpose a podcast episode into marketing content\n- User asks to create social media posts, blog articles, or newsletters from an episode\n\n- User wants show notes with timestamps and key takeaways\n- User asks to generate pull quotes, audiogram clips, or short-form video clips\n\n- User provides an RSS feed and wants to process episodes in batch\n- User shares a YouTube link to a podcast episode or video interview\n\n- User says \"turn this episode into content\", \"repurpose this podcast\", or \"create marketing from my episode\"\n- User wants to create a content calendar from podcast episodes\n\n## When NOT to Use\n\n- Creating a podcast from scratch (use the `podcast-generator` skill instead)\n- General social media management unrelated to podcast content\n\n## Input Modes\n\n### Mode 1: RSS Feed\n\nAuto-download and transcribe the latest episode(s) from a podcast RSS feed.\n\n1. Parse the RSS feed to extract episode metadata (title, description, publish date, audio URL).\n2. Download the audio file.\n\n3. Transcribe using OpenAI Whisper (produces timestamped transcript).\n4. Proceed to content generation.\n\nRead `rss-and-batch.md` for RSS parsing details and the Whisper transcription pipeline.\n\n### Mode 2: Raw Transcript\n\nAccept a transcript file directly — plain text, SRT, or VTT format.\n\n1. Detect format from file extension or content structure.\n2. Parse into a normalized transcript (list of segments with optional timestamps).\n\n3. Proceed to content generation.\n\nSRT\u002FVTT files preserve timestamps, which enables show notes with time markers. Plain text works but won't have timestamp data.\n\n### Mode 3: YouTube Link\n\nExtract transcript and metadata from a YouTube video — works for podcast episodes, interviews, talks, or any video with speech.\n\n1. Accept a YouTube URL (full or short format).\n2. Attempt to fetch YouTube's auto-generated or manually uploaded captions first (fast, free, no API key needed).\n\n3. If no captions are available, download the audio track and transcribe via Whisper.\n4. Extract video metadata (title, channel, description, publish date, duration).\n\n5. Proceed to content generation.\n\nRead `youtube-processing.md` for the full YouTube extraction pipeline.\n\n### Mode 4: Batch Mode\n\nProcess the last N episodes from an RSS feed automatically.\n\n1. Parse the RSS feed.\n2. Sort episodes by publish date (newest first).\n\n3. Download and transcribe each episode.\n4. Run the content generation pipeline for each episode.\n\n5. Organize output by episode (one directory per episode).\n\nRead `rss-and-batch.md` for batch processing details.\n\n## Content Generation Pipeline\n\nOnce you have a transcript and episode metadata, follow this pipeline. The order matters — each step builds on the previous one.\n\n### Step 1: Extract Content Atoms\n\nThis replaces a simple summary. Analyze the full transcript and extract **7 types of content atoms** — these are the raw material for everything downstream.\n\n| Atom Type | What to Look For | Example |\n\n|-----------|-----------------|---------|\n\n| **Narrative Arcs** | Stories with setup, tension, resolution | \"When we almost lost the company in 2019...\" |\n\n| **Quotable Moments** | Punchy, memorable one-liners | \"Culture eats strategy for breakfast, but execution eats both\" |\n\n| **Controversial Takes** | Opinions that challenge mainstream thinking | \"I think remote work is actually worse for junior employees\" |\n\n| **Data Points** | Statistics, numbers, research findings | \"We saw a 340% increase after switching to...\" |\n\n| **Frameworks** | Mental models, step-by-step processes | \"The 3-bucket prioritization system...\" |\n\n| **Stories** | Personal anecdotes, case studies, examples | \"Our first customer was actually...\" |\n\n| **Predictions** | Forward-looking claims about trends | \"In 5 years, every company will need to...\" |\n\nFor each atom, capture: the verbatim text, timestamps (start\u002Fend), speaker, atom type, and a one-line hook that could open a social post.\n\n**Timestamp requirement:** Every atom MUST include `start_timestamp`and`end_timestamp` in seconds. Match the verbatim text against the transcript segments to find the correct timestamps. Without timestamps, video clip selection is impossible.\n\n**Long transcript handling:** If the transcript exceeds 50,000 characters, split into overlapping chunks (5,000 char overlap) and extract atoms from each chunk separately. Deduplicate by comparing verbatim_text similarity (>80% overlap = duplicate). Merge and re-rank.\n\nRead `content-atoms.md` for the full extraction prompt and output format.\n\n### Step 2: Score and Assign Content Atoms\n\nScore each atom on three dimensions to prioritize the strongest content:\n\n| Dimension | Weight | What It Measures |\n\n|-----------|--------|-----------------|\n\n| **Novelty** | 40% | Is this new, surprising, or counter-intuitive? |\n\n| **Controversy** | 30% | Will people disagree, debate, or have strong reactions? |\n\n| **Utility** | 30% | Can someone apply this immediately? |\n\n#### Score thresholds\n\n- **80-100**: Priority publish — lead with these\n- **60-79**: Strong fill — solid content for the calendar\n\n- **40-59**: Gap filler — use when scheduling needs variety\n- **Below 40**: Cut — not worth publishing\n\n**Atom-to-platform assignment (anti-repetition rule):** After scoring, assign each atom to AT MOST 2 content pieces. No single quote should appear verbatim in more than 2 outputs. Use this mapping to assign the highest-scoring atoms first:\n\n| Platform | Best Atom Types | Lead Atom |\n\n|----------|----------------|-----------|\n\n| Twitter thread | Controversial takes, data points | Assign atom \\#1 by score |\n\n| LinkedIn post | Frameworks, data points | Assign a DIFFERENT atom than Twitter |\n\n| Blog post | Narrative arcs, stories | Assign a DIFFERENT atom than Twitter\u002FLinkedIn |\n\n| Newsletter | Top 2-3 by score, any type | Can reuse 1 atom from blog |\n\n| Quote cards | Quotable moments | Use atoms NOT already assigned to other platforms |\n\n| Video clips | Controversial takes, stories, data points | Based on timestamp availability |\n\nThis ensures each platform leads with a unique angle rather than repeating the same quote everywhere.\n\n### Step 3: Show Notes\n\nGenerate structured show notes with:\n\n- Episode title and one-paragraph description\n- Timestamped topic outline (if timestamps available)\n\n- Key takeaways as bullet points (5-7)\n- **ALL links mentioned** in the episode — parse from YouTube description, transcript mentions of URLs, and episode metadata. Include every reference link, not just a subset\n\n- Guest bio (if interview format — pull from transcript intro or episode metadata)\n\n### Step 4: Blog Post\n\nWrite an 800-1200 word article that:\n\n- Opens with the atom assigned to the blog (from Step 2) as the hook (not \"In this episode...\")\n- Expands on 2-3 top atoms with context and examples from the conversation\n\n- Includes 1-2 pull quotes from the transcript\n- Ends with a CTA to listen to the full episode\n\n- Uses subheadings for scannability\n\n**Hard limit: 1,200 words maximum.** Count words before saving. If over, cut the weakest section.\n\n### Step 5: Social Media Posts\n\nGenerate platform-specific posts. Each platform MUST lead with a DIFFERENT atom (from Step 2 assignment):\n\n#### Twitter\u002FX Thread (5-8 tweets)\n\n- Tweet 1: Hook — the atom assigned to Twitter (controversial take or novel insight)\n- Tweets 2-6: One atom per tweet, using the speakers' own words when possible\n\n- Final tweet: CTA with episode link\n- **HARD LIMIT: Every tweet MUST be under 280 characters including spaces and URLs.** Count characters before saving. Split long quotes across two tweets if needed.\n\n##### LinkedIn Post (1 long-form)\n\n- Open with the atom assigned to LinkedIn (framework or data point — NOT the same as Twitter hook)\n- Share 2-3 insights with brief context\n\n- Professional tone, first-person perspective\n- End with a question to drive engagement + episode link\n\n- 1,200-1,500 characters\n\n###### Instagram Caption\n\n- Conversational, accessible tone\n- Lead with the \"why should I care\" angle\n\n- Include 3-5 relevant hashtags\n- End with CTA to listen (link in bio)\n\n- 300-500 characters\n\n**Multi-topic episodes:** If the episode covers 3+ distinct topics, also generate 1 standalone tweet per topic (not threads — single tweets) for drip-posting throughout the week. Include these in the calendar.\n\nRead `content-templates.md` for detailed templates and examples for each platform.\n\n### Step 6: Email Newsletter\n\nWrite newsletter copy that:\n\n- Subject line: curiosity-driven, under 50 characters\n- Preview text: complements the subject line, under 90 characters\n\n- Body: 200-300 words built around the top 2-3 atoms\n- Include 1 pull quote (can reuse 1 from blog)\n\n- Clear CTA button text (e.g., \"Listen Now\", \"Hear the Full Conversation\")\n\n### Step 7: Pull Quotes\n\nSelect 5-8 standalone quotes that:\n\n- Make sense without context\n- Are surprising, insightful, or emotionally resonant\n\n- Are under 150 characters each (for shareable graphics)\n- Include speaker attribution\n\n- Have timestamps (for linking to the exact moment)\n\n### Step 8: Quote Cards\n\nGenerate visual quote card images for the top 3-5 pull quotes.\n\n**Requires Tier 2 dependencies** (Pillow + system fonts). Run `scripts\u002Fgenerate_quote_cards.py`:\n\n```python\n\nfrom generate_quote_cards import batch_generate\n\nquotes = [\n\n{\"text\": \"Quote text here\", \"speaker_name\": \"Speaker\", \"speaker_title\": \"Title\"},\n\n...\n\n]\n\npaths = batch_generate(quotes, output_dir=\"quote-cards\u002F\", podcast_name=\"Podcast Name\")\n\n```\n\nEach quote produces 3 files:\n\n- `quote-N-instagram-1080x1080.png` (feed posts, carousels)\n- `quote-N-twitter-1200x675.png` (tweets, LinkedIn)\n\n- `quote-N-stories-1080x1920.png` (Instagram Stories, TikTok)\n\nRead `quote-cards.md` for design specs, color customization, and AI background generation.\n\n### Step 9: Short-Form Video Clips (Opus Clips Style)\n\nAutomatically identify and extract the best 30-90 second moments from the episode for YouTube Shorts, TikTok, and Instagram Reels.\n\n**Requires Tier 3 dependencies** (ffmpeg + yt-dlp). For animated captions, also requires Tier 4 (OpenAI Whisper).\n\nThe pipeline:\n\n1. Use content atoms (especially controversial takes, stories, and data points) to identify clip-worthy moments. **Atoms MUST have start\u002Fend timestamps** — atoms without timestamps are skipped.\n2. Download the source video if from YouTube (`scripts\u002Fgenerate_video_clips.download_youtube_video`).\n\n3. Trim clips at the identified timestamps with fade in\u002Fout.\n4. Reformat to 9:16 vertical (center-crop or letterbox).\n\n5. **If Tier 4 available:** Add animated word-by-word captions (Opus Clips style) via Whisper re-transcription of each clip.\n6. **If Tier 4 unavailable:** Add static segment-level captions using transcript data (still readable, just not word-highlighted).\n\n7. Burn in a progress bar and speaker name lower third.\n\nTarget: 3-5 clips per episode, each scored by viral potential. Generate a hook title for each clip.\n\n```python\n\nfrom generate_video_clips import extract_clips\n\nresults = extract_clips(\n\nvideo_path=\"episode.mp4\",\n\natoms=scored_atoms, \\# must have start_timestamp\u002Fend_timestamp\n\noutput_dir=\"clips\u002F\",\n\nspeaker_name=\"Speaker Name\",\n\nmax_clips=5,\n\n)\n\n```\n\nRead `video-clips.md` for the full video clip extraction and captioning pipeline.\n\n### Step 10: Content Calendar\n\nAuto-schedule all generated content across platforms using best-practice timing:\n\n| Platform | Best Times | Frequency | Content Types |\n\n|----------|-----------|-----------|--------------|\n\n| Twitter\u002FX | 9-11am, 1-3pm weekdays | 1-2 posts\u002Fday | Threads, quote cards, clip links, topic tweets |\n\n| LinkedIn | Tue-Thu 8-10am | 2-3 posts\u002Fweek | Articles, quote cards, insights |\n\n| Instagram | Mon\u002FWed\u002FFri 11am-1pm | 3-5 posts\u002Fweek | Quote cards, carousels, Reels |\n\n| TikTok | Tue\u002FThu\u002FSat 7-9pm | 3-5 posts\u002Fweek | Short-form clips |\n\n| YouTube | Sat\u002FSun 9am-12pm | 1-2 Shorts\u002Fweek | Short-form clips |\n\n| Newsletter | Tue\u002FThu morning | 1\u002Fweek | Newsletter copy |\n\n| Blog | Any weekday | 1\u002Fepisode | Blog post |\n\nRead `content-calendar.md` for scheduling logic, content mix optimization, and calendar output format.\n\n## Quality Checklist\n\nRun this checklist before delivering content to the user:\n\n- [ ] **No quote recycling**: No verbatim quote appears in more than 2 content pieces\n- [ ] **Platform leads are unique**: Twitter, LinkedIn, and blog each open with a different atom\u002Fangle\n\n- [ ] **Twitter character limits**: Every tweet is under 280 characters (count them)\n- [ ] **Blog word count**: Blog post is 800-1,200 words (count them)\n\n- [ ] **LinkedIn character count**: Post is 1,200-1,500 characters\n- [ ] **Instagram length**: Caption is 300-500 characters before hashtags\n\n- [ ] **Newsletter subject line**: Under 50 characters\n- [ ] **All links captured**: Show notes include every link from the YouTube description\u002Fepisode metadata\n\n- [ ] **Timestamps on atoms**: Every atom has start*timestamp and end*timestamp\n- [ ] **Pull quotes are short**: Each under 150 characters\n\n- [ ] **Content pieces generated individually**: Each piece was generated in its own LLM call (not batched with ---SEPARATOR--- patterns that cause content to bleed between files)\n\n## Generation Best Practices\n\n**Generate each content piece in a separate LLM call.** Do NOT batch multiple outputs (e.g., \"generate blog + social + newsletter separated by ---SEPARATOR---\"). This causes:\n\n- Content bleeding between files (e.g., Twitter thread ends up in LinkedIn file)\n- Quality degradation on later pieces as the model runs out of attention\n\n- Inconsistent formatting\n\nInstead: generate atoms first, then generate each content piece independently with the atoms + relevant assignment as context. This produces better quality and avoids file-splitting bugs.\n\n**For long transcripts (>50K chars):** Split into 2-3 chunks with 5K char overlap. Extract atoms from each chunk. Merge and deduplicate before scoring.\n\n## Output Structure\n\n```text\n\npodcast-content\u002F\n\n├── episode-title\u002F\n\n│ ├── atoms.json \\# Extracted + scored content atoms with timestamps\n\n│ ├── show-notes.md\n\n│ ├── blog-post.md\n\n│ ├── social\u002F\n\n│ │ ├── twitter-thread.md\n\n│ │ ├── linkedin-post.md\n\n│ │ ├── instagram-caption.md\n\n│ │ └── topic-tweets.md \\# (multi-topic episodes only)\n\n│ ├── newsletter.md\n\n│ ├── pull-quotes.md\n\n│ ├── quote-cards\u002F \\# (Tier 2)\n\n│ │ ├── quote-1-instagram-1080x1080.png\n\n│ │ ├── quote-1-twitter-1200x675.png\n\n│ │ ├── quote-1-stories-1080x1920.png\n\n│ │ └── ...\n\n│ ├── clips\u002F \\# (Tier 3+)\n\n│ │ ├── clip-1-vertical.mp4\n\n│ │ ├── clip-2-vertical.mp4\n\n│ │ └── clips-metadata.json\n\n│ ├── audiograms\u002F \\# (audio-only or requested)\n\n│ │ ├── clip-1.mp4\n\n│ │ └── ...\n\n│ └── calendar.json \\# Scheduled content calendar\n\n```\n\n## Tone & Voice Calibration\n\nBefore generating content, ask the user (or infer from their existing content):\n\n- **Brand voice** — formal, conversational, edgy, academic, playful?\n- **Target audience** — who reads\u002Ffollows their content?\n\n- **Platform priorities** — which platforms matter most?\n- **Minimum viral score** — threshold for content to make the cut (default: 40)\n\nIf not specified, default to conversational and professional. Mirror the energy of the podcast itself — if the hosts are casual and funny, the marketing content should reflect that.\n\n## Composability\n\nThis skill works alongside the `podcast-generator` skill. A typical workflow might be:\n\n1. Use `podcast-generator` to create an episode from research\n2. Use `podcast-marketing` to repurpose that episode into content\n\n## References\n\n- `content-atoms.md` — Content atom extraction prompt, the 7 atom types, output format, and scoring rubric. Read first — atoms are the foundation for all content.\n- `content-templates.md` — Detailed templates and examples for each content type (social posts, blog, newsletter, show notes, pull quotes). Read when generating specific content types.\n- `quote-cards.md` — Quote card design specifications, image generation, and multi-format output. Read when generating quote cards.\n- `video-clips.md` — Opus Clips-style video clip extraction, vertical reformatting, animated captions, and progress bar overlay. Read when generating short-form video clips.\n- `content-calendar.md` — Platform-specific scheduling rules, content mix optimization, and calendar JSON output format. Read when generating a content calendar.\n- `audio-processing.md` — Whisper transcription setup, audiogram generation pipeline, and audio clip extraction. Read when handling audio input or generating audiograms.\n- `rss-and-batch.md` — RSS feed parsing, episode downloading, and batch processing logic. Read when the input is an RSS feed or batch mode is requested.\n- `youtube-processing.md` — YouTube URL handling, caption extraction, audio download, and metadata retrieval. Read when the input is a YouTube link.\n","# Podcast Marketing\n\n## OpenClawd Operator Adaptation\n\nRun this skill as part of the OpenClawd operator deck. Preserve the skill-specific workflow below, but frame outputs for Solana-native agents when relevant: prefer OpenClawd language, note whether the work can support autonomous agent operations, and keep financial, legal, tax, hiring, medical, or other regulated outputs informational unless the skill already requires a stricter disclaimer. Use the Llobster Legend persona only as light operator framing; do not let branding override accuracy, safety, or the user's stated domain.\n\n\nTurn podcast episodes into a full suite of marketing content. Supports four input modes, extracts content atoms with viral scoring, and produces platform-ready content pieces that can be published immediately.\n\n## Requirements & Setup\n\n### Tier 1: Text Content (always needed)\n\nThese are required for transcript extraction and content generation (show notes, blog, social, newsletter, pull quotes):\n\n| Dependency | Install | Purpose |\n\n|-----------|---------|---------|\n\n| Python 3.10+ | `installProgrammingLanguage({ language: \"python-3.11\" })` | Runtime for all scripts |\n\n| youtube-transcript-api | `installLanguagePackages({ language: \"python\", packages: [\"youtube-transcript-api\"] })` | YouTube caption extraction |\n\n| yt-dlp | `installLanguagePackages({ language: \"python\", packages: [\"yt-dlp\"] })` | YouTube metadata + video\u002Faudio download |\n\n| LLM API | Set up via Anthropic or OpenAI AI integration (Replit proxy — no user API key needed) | Content atom extraction and content generation |\n\n### Tier 2: Quote Card Images\n\nThese are required to generate visual quote card PNG files:\n\n| Dependency | Install | Purpose |\n\n|-----------|---------|---------|\n\n| Pillow | `installLanguagePackages({ language: \"python\", packages: [\"Pillow\"] })` | Image generation |\n\n| System fonts | Already available on Nix (DejaVu Sans at `\u002Fusr\u002Fshare\u002Ffonts\u002Ftruetype\u002Fdejavu\u002F`) | Typography |\n\nNo API keys needed. Run `scripts\u002Fgenerate_quote_cards.py` directly.\n\n### Tier 3: Short-Form Video Clips (basic)\n\nThese produce trimmed, vertical-reformatted video clips without animated captions:\n\n| Dependency | Install | Purpose |\n\n|-----------|---------|---------|\n\n| ffmpeg | `installSystemDependencies({ packages: [\"ffmpeg\"] })` | Video trimming, reformatting, subtitle burning |\n\n| yt-dlp | (already in Tier 1) | Download source video from YouTube |\n\n### Tier 4: Animated Captions (Opus Clips style)\n\nThese add word-by-word highlighted captions to video clips:\n\n| Dependency | Install | Purpose |\n\n|-----------|---------|---------|\n\n| OpenAI API | Set up OpenAI AI integration OR user provides `OPENAI_API_KEY` | Whisper word-level timestamps |\n\n| Pillow | (already in Tier 2) | Caption frame generation (alternative to ASS subtitles) |\n\nThe animated caption pipeline re-transcribes each trimmed clip through Whisper with `timestamp_granularities=[\"word\"]` to get per-word timing. Without this, clips still work but use segment-level static captions instead.\n\n### Setup Checklist\n\nBefore running the pipeline, verify:\n\n```python\n\n# Tier 1\n\nimport youtube_transcript_api \\# YouTube captions\n\nimport yt_dlp \\# YouTube metadata\u002Fdownload\n\nimport anthropic \\# or openai — for content generation\n\n# Tier 2 (if generating quote cards)\n\nfrom PIL import Image, ImageFont\n\nImageFont.truetype(\"\u002Fusr\u002Fshare\u002Ffonts\u002Ftruetype\u002Fdejavu\u002FDejaVuSans-Bold.ttf\", 48)\n\n# Tier 3 (if generating video clips)\n\nimport subprocess\n\nsubprocess.run([\"ffmpeg\", \"-version\"], capture_output=True, check=True)\n\n# Tier 4 (if generating animated captions)\n\nimport openai \\# OPENAI_API_KEY must be set\n\n```\n\n## When to Use\n\n- User wants to repurpose a podcast episode into marketing content\n- User asks to create social media posts, blog articles, or newsletters from an episode\n\n- User wants show notes with timestamps and key takeaways\n- User asks to generate pull quotes, audiogram clips, or short-form video clips\n\n- User provides an RSS feed and wants to process episodes in batch\n- User shares a YouTube link to a podcast episode or video interview\n\n- User says \"turn this episode into content\", \"repurpose this podcast\", or \"create marketing from my episode\"\n- User wants to create a content calendar from podcast episodes\n\n## When NOT to Use\n\n- Creating a podcast from scratch (use the `podcast-generator` skill instead)\n- General social media management unrelated to podcast content\n\n## Input Modes\n\n### Mode 1: RSS Feed\n\nAuto-download and transcribe the latest episode(s) from a podcast RSS feed.\n\n1. Parse the RSS feed to extract episode metadata (title, description, publish date, audio URL).\n2. Download the audio file.\n\n3. Transcribe using OpenAI Whisper (produces timestamped transcript).\n4. Proceed to content generation.\n\nRead `rss-and-batch.md` for RSS parsing details and the Whisper transcription pipeline.\n\n### Mode 2: Raw Transcript\n\nAccept a transcript file directly — plain text, SRT, or VTT format.\n\n1. Detect format from file extension or content structure.\n2. Parse into a normalized transcript (list of segments with optional timestamps).\n\n3. Proceed to content generation.\n\nSRT\u002FVTT files preserve timestamps, which enables show notes with time markers. Plain text works but won't have timestamp data.\n\n### Mode 3: YouTube Link\n\nExtract transcript and metadata from a YouTube video — works for podcast episodes, interviews, talks, or any video with speech.\n\n1. Accept a YouTube URL (full or short format).\n2. Attempt to fetch YouTube's auto-generated or manually uploaded captions first (fast, free, no API key needed).\n\n3. If no captions are available, download the audio track and transcribe via Whisper.\n4. Extract video metadata (title, channel, description, publish date, duration).\n\n5. Proceed to content generation.\n\nRead `youtube-processing.md` for the full YouTube extraction pipeline.\n\n### Mode 4: Batch Mode\n\nProcess the last N episodes from an RSS feed automatically.\n\n1. Parse the RSS feed.\n2. Sort episodes by publish date (newest first).\n\n3. Download and transcribe each episode.\n4. Run the content generation pipeline for each episode.\n\n5. Organize output by episode (one directory per episode).\n\nRead `rss-and-batch.md` for batch processing details.\n\n## Content Generation Pipeline\n\nOnce you have a transcript and episode metadata, follow this pipeline. The order matters — each step builds on the previous one.\n\n### Step 1: Extract Content Atoms\n\nThis replaces a simple summary. Analyze the full transcript and extract **7 types of content atoms** — these are the raw material for everything downstream.\n\n| Atom Type | What to Look For | Example |\n\n|-----------|-----------------|---------|\n\n| **Narrative Arcs** | Stories with setup, tension, resolution | \"When we almost lost the company in 2019...\" |\n\n| **Quotable Moments** | Punchy, memorable one-liners | \"Culture eats strategy for breakfast, but execution eats both\" |\n\n| **Controversial Takes** | Opinions that challenge mainstream thinking | \"I think remote work is actually worse for junior employees\" |\n\n| **Data Points** | Statistics, numbers, research findings | \"We saw a 340% increase after switching to...\" |\n\n| **Frameworks** | Mental models, step-by-step processes | \"The 3-bucket prioritization system...\" |\n\n| **Stories** | Personal anecdotes, case studies, examples | \"Our first customer was actually...\" |\n\n| **Predictions** | Forward-looking claims about trends | \"In 5 years, every company will need to...\" |\n\nFor each atom, capture: the verbatim text, timestamps (start\u002Fend), speaker, atom type, and a one-line hook that could open a social post.\n\n**Timestamp requirement:** Every atom MUST include `start_timestamp`and`end_timestamp` in seconds. Match the verbatim text against the transcript segments to find the correct timestamps. Without timestamps, video clip selection is impossible.\n\n**Long transcript handling:** If the transcript exceeds 50,000 characters, split into overlapping chunks (5,000 char overlap) and extract atoms from each chunk separately. Deduplicate by comparing verbatim_text similarity (>80% overlap = duplicate). Merge and re-rank.\n\nRead `content-atoms.md` for the full extraction prompt and output format.\n\n### Step 2: Score and Assign Content Atoms\n\nScore each atom on three dimensions to prioritize the strongest content:\n\n| Dimension | Weight | What It Measures |\n\n|-----------|--------|-----------------|\n\n| **Novelty** | 40% | Is this new, surprising, or counter-intuitive? |\n\n| **Controversy** | 30% | Will people disagree, debate, or have strong reactions? |\n\n| **Utility** | 30% | Can someone apply this immediately? |\n\n#### Score thresholds\n\n- **80-100**: Priority publish — lead with these\n- **60-79**: Strong fill — solid content for the calendar\n\n- **40-59**: Gap filler — use when scheduling needs variety\n- **Below 40**: Cut — not worth publishing\n\n**Atom-to-platform assignment (anti-repetition rule):** After scoring, assign each atom to AT MOST 2 content pieces. No single quote should appear verbatim in more than 2 outputs. Use this mapping to assign the highest-scoring atoms first:\n\n| Platform | Best Atom Types | Lead Atom |\n\n|----------|----------------|-----------|\n\n| Twitter thread | Controversial takes, data points | Assign atom \\#1 by score |\n\n| LinkedIn post | Frameworks, data points | Assign a DIFFERENT atom than Twitter |\n\n| Blog post | Narrative arcs, stories | Assign a DIFFERENT atom than Twitter\u002FLinkedIn |\n\n| Newsletter | Top 2-3 by score, any type | Can reuse 1 atom from blog |\n\n| Quote cards | Quotable moments | Use atoms NOT already assigned to other platforms |\n\n| Video clips | Controversial takes, stories, data points | Based on timestamp availability |\n\nThis ensures each platform leads with a unique angle rather than repeating the same quote everywhere.\n\n### Step 3: Show Notes\n\nGenerate structured show notes with:\n\n- Episode title and one-paragraph description\n- Timestamped topic outline (if timestamps available)\n\n- Key takeaways as bullet points (5-7)\n- **ALL links mentioned** in the episode — parse from YouTube description, transcript mentions of URLs, and episode metadata. Include every reference link, not just a subset\n\n- Guest bio (if interview format — pull from transcript intro or episode metadata)\n\n### Step 4: Blog Post\n\nWrite an 800-1200 word article that:\n\n- Opens with the atom assigned to the blog (from Step 2) as the hook (not \"In this episode...\")\n- Expands on 2-3 top atoms with context and examples from the conversation\n\n- Includes 1-2 pull quotes from the transcript\n- Ends with a CTA to listen to the full episode\n\n- Uses subheadings for scannability\n\n**Hard limit: 1,200 words maximum.** Count words before saving. If over, cut the weakest section.\n\n### Step 5: Social Media Posts\n\nGenerate platform-specific posts. Each platform MUST lead with a DIFFERENT atom (from Step 2 assignment):\n\n#### Twitter\u002FX Thread (5-8 tweets)\n\n- Tweet 1: Hook — the atom assigned to Twitter (controversial take or novel insight)\n- Tweets 2-6: One atom per tweet, using the speakers' own words when possible\n\n- Final tweet: CTA with episode link\n- **HARD LIMIT: Every tweet MUST be under 280 characters including spaces and URLs.** Count characters before saving. Split long quotes across two tweets if needed.\n\n##### LinkedIn Post (1 long-form)\n\n- Open with the atom assigned to LinkedIn (framework or data point — NOT the same as Twitter hook)\n- Share 2-3 insights with brief context\n\n- Professional tone, first-person perspective\n- End with a question to drive engagement + episode link\n\n- 1,200-1,500 characters\n\n###### Instagram Caption\n\n- Conversational, accessible tone\n- Lead with the \"why should I care\" angle\n\n- Include 3-5 relevant hashtags\n- End with CTA to listen (link in bio)\n\n- 300-500 characters\n\n**Multi-topic episodes:** If the episode covers 3+ distinct topics, also generate 1 standalone tweet per topic (not threads — single tweets) for drip-posting throughout the week. Include these in the calendar.\n\nRead `content-templates.md` for detailed templates and examples for each platform.\n\n### Step 6: Email Newsletter\n\nWrite newsletter copy that:\n\n- Subject line: curiosity-driven, under 50 characters\n- Preview text: complements the subject line, under 90 characters\n\n- Body: 200-300 words built around the top 2-3 atoms\n- Include 1 pull quote (can reuse 1 from blog)\n\n- Clear CTA button text (e.g., \"Listen Now\", \"Hear the Full Conversation\")\n\n### Step 7: Pull Quotes\n\nSelect 5-8 standalone quotes that:\n\n- Make sense without context\n- Are surprising, insightful, or emotionally resonant\n\n- Are under 150 characters each (for shareable graphics)\n- Include speaker attribution\n\n- Have timestamps (for linking to the exact moment)\n\n### Step 8: Quote Cards\n\nGenerate visual quote card images for the top 3-5 pull quotes.\n\n**Requires Tier 2 dependencies** (Pillow + system fonts). Run `scripts\u002Fgenerate_quote_cards.py`:\n\n```python\n\nfrom generate_quote_cards import batch_generate\n\nquotes = [\n\n{\"text\": \"Quote text here\", \"speaker_name\": \"Speaker\", \"speaker_title\": \"Title\"},\n\n...\n\n]\n\npaths = batch_generate(quotes, output_dir=\"quote-cards\u002F\", podcast_name=\"Podcast Name\")\n\n```\n\nEach quote produces 3 files:\n\n- `quote-N-instagram-1080x1080.png` (feed posts, carousels)\n- `quote-N-twitter-1200x675.png` (tweets, LinkedIn)\n\n- `quote-N-stories-1080x1920.png` (Instagram Stories, TikTok)\n\nRead `quote-cards.md` for design specs, color customization, and AI background generation.\n\n### Step 9: Short-Form Video Clips (Opus Clips Style)\n\nAutomatically identify and extract the best 30-90 second moments from the episode for YouTube Shorts, TikTok, and Instagram Reels.\n\n**Requires Tier 3 dependencies** (ffmpeg + yt-dlp). For animated captions, also requires Tier 4 (OpenAI Whisper).\n\nThe pipeline:\n\n1. Use content atoms (especially controversial takes, stories, and data points) to identify clip-worthy moments. **Atoms MUST have start\u002Fend timestamps** — atoms without timestamps are skipped.\n2. Download the source video if from YouTube (`scripts\u002Fgenerate_video_clips.download_youtube_video`).\n\n3. Trim clips at the identified timestamps with fade in\u002Fout.\n4. Reformat to 9:16 vertical (center-crop or letterbox).\n\n5. **If Tier 4 available:** Add animated word-by-word captions (Opus Clips style) via Whisper re-transcription of each clip.\n6. **If Tier 4 unavailable:** Add static segment-level captions using transcript data (still readable, just not word-highlighted).\n\n7. Burn in a progress bar and speaker name lower third.\n\nTarget: 3-5 clips per episode, each scored by viral potential. Generate a hook title for each clip.\n\n```python\n\nfrom generate_video_clips import extract_clips\n\nresults = extract_clips(\n\nvideo_path=\"episode.mp4\",\n\natoms=scored_atoms, \\# must have start_timestamp\u002Fend_timestamp\n\noutput_dir=\"clips\u002F\",\n\nspeaker_name=\"Speaker Name\",\n\nmax_clips=5,\n\n)\n\n```\n\nRead `video-clips.md` for the full video clip extraction and captioning pipeline.\n\n### Step 10: Content Calendar\n\nAuto-schedule all generated content across platforms using best-practice timing:\n\n| Platform | Best Times | Frequency | Content Types |\n\n|----------|-----------|-----------|--------------|\n\n| Twitter\u002FX | 9-11am, 1-3pm weekdays | 1-2 posts\u002Fday | Threads, quote cards, clip links, topic tweets |\n\n| LinkedIn | Tue-Thu 8-10am | 2-3 posts\u002Fweek | Articles, quote cards, insights |\n\n| Instagram | Mon\u002FWed\u002FFri 11am-1pm | 3-5 posts\u002Fweek | Quote cards, carousels, Reels |\n\n| TikTok | Tue\u002FThu\u002FSat 7-9pm | 3-5 posts\u002Fweek | Short-form clips |\n\n| YouTube | Sat\u002FSun 9am-12pm | 1-2 Shorts\u002Fweek | Short-form clips |\n\n| Newsletter | Tue\u002FThu morning | 1\u002Fweek | Newsletter copy |\n\n| Blog | Any weekday | 1\u002Fepisode | Blog post |\n\nRead `content-calendar.md` for scheduling logic, content mix optimization, and calendar output format.\n\n## Quality Checklist\n\nRun this checklist before delivering content to the user:\n\n- [ ] **No quote recycling**: No verbatim quote appears in more than 2 content pieces\n- [ ] **Platform leads are unique**: Twitter, LinkedIn, and blog each open with a different atom\u002Fangle\n\n- [ ] **Twitter character limits**: Every tweet is under 280 characters (count them)\n- [ ] **Blog word count**: Blog post is 800-1,200 words (count them)\n\n- [ ] **LinkedIn character count**: Post is 1,200-1,500 characters\n- [ ] **Instagram length**: Caption is 300-500 characters before hashtags\n\n- [ ] **Newsletter subject line**: Under 50 characters\n- [ ] **All links captured**: Show notes include every link from the YouTube description\u002Fepisode metadata\n\n- [ ] **Timestamps on atoms**: Every atom has start*timestamp and end*timestamp\n- [ ] **Pull quotes are short**: Each under 150 characters\n\n- [ ] **Content pieces generated individually**: Each piece was generated in its own LLM call (not batched with ---SEPARATOR--- patterns that cause content to bleed between files)\n\n## Generation Best Practices\n\n**Generate each content piece in a separate LLM call.** Do NOT batch multiple outputs (e.g., \"generate blog + social + newsletter separated by ---SEPARATOR---\"). This causes:\n\n- Content bleeding between files (e.g., Twitter thread ends up in LinkedIn file)\n- Quality degradation on later pieces as the model runs out of attention\n\n- Inconsistent formatting\n\nInstead: generate atoms first, then generate each content piece independently with the atoms + relevant assignment as context. This produces better quality and avoids file-splitting bugs.\n\n**For long transcripts (>50K chars):** Split into 2-3 chunks with 5K char overlap. Extract atoms from each chunk. Merge and deduplicate before scoring.\n\n## Output Structure\n\n```text\n\npodcast-content\u002F\n\n├── episode-title\u002F\n\n│ ├── atoms.json \\# Extracted + scored content atoms with timestamps\n\n│ ├── show-notes.md\n\n│ ├── blog-post.md\n\n│ ├── social\u002F\n\n│ │ ├── twitter-thread.md\n\n│ │ ├── linkedin-post.md\n\n│ │ ├── instagram-caption.md\n\n│ │ └── topic-tweets.md \\# (multi-topic episodes only)\n\n│ ├── newsletter.md\n\n│ ├── pull-quotes.md\n\n│ ├── quote-cards\u002F \\# (Tier 2)\n\n│ │ ├── quote-1-instagram-1080x1080.png\n\n│ │ ├── quote-1-twitter-1200x675.png\n\n│ │ ├── quote-1-stories-1080x1920.png\n\n│ │ └── ...\n\n│ ├── clips\u002F \\# (Tier 3+)\n\n│ │ ├── clip-1-vertical.mp4\n\n│ │ ├── clip-2-vertical.mp4\n\n│ │ └── clips-metadata.json\n\n│ ├── audiograms\u002F \\# (audio-only or requested)\n\n│ │ ├── clip-1.mp4\n\n│ │ └── ...\n\n│ └── calendar.json \\# Scheduled content calendar\n\n```\n\n## Tone & Voice Calibration\n\nBefore generating content, ask the user (or infer from their existing content):\n\n- **Brand voice** — formal, conversational, edgy, academic, playful?\n- **Target audience** — who reads\u002Ffollows their content?\n\n- **Platform priorities** — which platforms matter most?\n- **Minimum viral score** — threshold for content to make the cut (default: 40)\n\nIf not specified, default to conversational and professional. Mirror the energy of the podcast itself — if the hosts are casual and funny, the marketing content should reflect that.\n\n## Composability\n\nThis skill works alongside the `podcast-generator` skill. A typical workflow might be:\n\n1. Use `podcast-generator` to create an episode from research\n2. Use `podcast-marketing` to repurpose that episode into content\n\n## References\n\n- `content-atoms.md` — Content atom extraction prompt, the 7 atom types, output format, and scoring rubric. Read first — atoms are the foundation for all content.\n- `content-templates.md` — Detailed templates and examples for each content type (social posts, blog, newsletter, show notes, pull quotes). Read when generating specific content types.\n- `quote-cards.md` — Quote card design specifications, image generation, and multi-format output. Read when generating quote cards.\n- `video-clips.md` — Opus Clips-style video clip extraction, vertical reformatting, animated captions, and progress bar overlay. Read when generating short-form video clips.\n- `content-calendar.md` — Platform-specific scheduling rules, content mix optimization, and calendar JSON output format. Read when generating a content calendar.\n- `audio-processing.md` — Whisper transcription setup, audiogram generation pipeline, and audio clip extraction. Read when handling audio input or generating audiograms.\n- `rss-and-batch.md` — RSS feed parsing, episode downloading, and batch processing logic. Read when the input is an RSS feed or batch mode is requested.\n- `youtube-processing.md` — YouTube URL handling, caption extraction, audio download, and metadata retrieval. Read when the input is a YouTube link.\n",{"name":5,"description":7},"main","6b4a291df75c639681e93b4b5b812126443fd6ed","secondary_skills\u002Fpodcast-marketing",3,"https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd","https:\u002F\u002Fsolanaclawd.com\u002Fopenclawd","https:\u002F\u002Fgithub.com\u002Fclawdsolana","https:\u002F\u002Fmusebook.trade","Welcome to Open Clawd. The future of Ai on and off chain. Bringing webMCP to web 3 using X402, A2A, MPP and so much more!","2026-08-01 09:30:51",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add clawdsolana\u002FOpenClawd --skill podcast-marketing",{"tool":60,"command":61},"bunx","bunx skills add clawdsolana\u002FOpenClawd --skill podcast-marketing",{"tool":63,"command":64},"pnpm","pnpm dlx skills add clawdsolana\u002FOpenClawd --skill podcast-marketing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fsecondary_skills\u002Fpodcast-marketing\u002FSKILL.md",true,[68,74,80,84,88,92,96,100,104],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},".fingerprint","OTHER","其他",32,"https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fsecondary_skills\u002Fpodcast-marketing\u002F.fingerprint",{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"audio-processing.md","REFERENCE","参考文档",9125,"https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fsecondary_skills\u002Fpodcast-marketing\u002Faudio-processing.md",{"path":81,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":82,"sourceHtmlUrl":83},"content-atoms.md",8547,"https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fsecondary_skills\u002Fpodcast-marketing\u002Fcontent-atoms.md",{"path":85,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":86,"sourceHtmlUrl":87},"content-calendar.md",6859,"https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fsecondary_skills\u002Fpodcast-marketing\u002Fcontent-calendar.md",{"path":89,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":90,"sourceHtmlUrl":91},"content-templates.md",7686,"https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fsecondary_skills\u002Fpodcast-marketing\u002Fcontent-templates.md",{"path":93,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":94,"sourceHtmlUrl":95},"quote-cards.md",5014,"https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fsecondary_skills\u002Fpodcast-marketing\u002Fquote-cards.md",{"path":97,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":98,"sourceHtmlUrl":99},"rss-and-batch.md",6129,"https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fsecondary_skills\u002Fpodcast-marketing\u002Frss-and-batch.md",{"path":101,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":102,"sourceHtmlUrl":103},"video-clips.md",13213,"https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fsecondary_skills\u002Fpodcast-marketing\u002Fvideo-clips.md",{"path":105,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":106,"sourceHtmlUrl":107},"youtube-processing.md",6826,"https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fsecondary_skills\u002Fpodcast-marketing\u002Fyoutube-processing.md",[109,140,167,192,202,226],{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":118,"publishedAt":139},"01M71KRBD0W01EAXJ8YM4M1SJ2","solana-dev","End-to-end Solana development playbook (Jan 2026). Prefer Solana Foundation framework-kit (@solana\u002Fclient + @solana\u002Freact-hooks) for React\u002FNext.js UI. Prefer @solana\u002Fkit for all new client\u002FRPC\u002Ftransaction code. When legacy dependencies require web3.js, isolate it behind @solana\u002Fweb3-compat (or @solana\u002Fweb3.js as a true legacy fallback). Covers wallet-standard-first connection (incl. ConnectorKit), Anchor\u002FPinocchio programs, Codama-based client generation, LiteSVM\u002FMollusk\u002FSurfpool testing, and security checklists.","https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fsolana-dev\u002FSKILL.md",[115],{"categoryNo":116,"categoryName":117,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138],"solana dev","dev","solana","Wallet","end","testing","hooks","kit","new","when","web3","code","react","next","2026","playbook","security","ui","fallback","framework","2026-11-10 10:56:23",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":149,"publishedAt":139},"01M71KR8QPESSY61SVE8ZTFNVT","xurl","A CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.","https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fskills\u002Fxurl\u002FSKILL.md",[146],{"categoryNo":147,"categoryName":148,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[142,32,150,151,152,153,154,128,155,156,157,158,159,160,161,162,163,164,165,166],"Media","x api","search","send","tap","you","api","cli","read","install","cli tool","endpoint","brew","for","manage","tool","twitter",{"skillNo":168,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":171,"categories":172,"keywords":174,"publishedAt":139},"01M71KR6FSXV88YDKWP7NBY3SH","wurk-integration","WURK API integration for monetizing agents with x402 payments on Solana\u002FBase - create social jobs, custom challenges, and agent help tasks","https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fskills\u002Fwurk-integration\u002FSKILL.md",[173],{"categoryNo":147,"categoryName":148,"taxonomyType":21,"taxonomyTypeDesc":22},[175,176,177,178,34,179,180,181,156,182,183,184,185,186,187,188,163,189,190,191],"wurk","wurk integration","integration","x402","payments","tasks","team","create","social-jobs","command","agent-help","custom-jobs","clawd","safe","api integration","custom","true",{"skillNo":193,"name":194,"nameZh":6,"description":195,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":196,"categories":197,"keywords":198,"publishedAt":139},"01M71KR4HCX41BPAK9GP7RPRRP","workflows","Manage application workflows including configuration, restart, and removal.","https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fskills\u002Fworkflows\u002FSKILL.md",[],[194,164,199,200,201],"configuration","application","restart",{"skillNo":203,"name":204,"nameZh":6,"description":205,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":206,"categories":207,"keywords":208,"publishedAt":139},"01M71KR1VM0F5GPEQDNG5J7A0H","web-search","Search the web, fetch content, extract branding profiles, and capture screenshots from URLs. Use for real-time information, API documentation, current events, design matching, and visual reference.","https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fskills\u002Fweb-search\u002FSKILL.md",[],[209,152,210,211,212,163,213,214,215,216,217,218,219,156,220,221,222,223,224,225],"web search","web","fetch","api documentation","real-time","time","profiles","design","use","information","visual","documentation","branding","matching","reference","capture","content",{"skillNo":227,"name":228,"nameZh":6,"description":229,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":230,"categories":231,"keywords":232,"publishedAt":139},"01M71KQZN5MR1JFQHG5GWXYAHS","weather","Get current weather and forecasts via wttr.in or Open-Meteo. Use when: user asks about weather, temperature, or forecasts for any location. NOT for: historical weather data, severe weather alerts, or detailed meteorological analysis. No API key needed.","https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fskills\u002Fweather\u002FSKILL.md",[],[228,233,163,234,217,128,235,156,236,237,238,239,240,241,242,243,244,245],"get","open","analysis","alerts","temperature","curl","via","help","about","https","location","data","user"]