End-to-end pipeline for publishing AGENCY Community meetup recordings to YouTube. Downloads Zoom recording, adds intro/outro, generates thumbnail, creates description with timecodes, uploads to YouTube, sets thumbnail, and adds to the AGENCY Community playlist. Use this skill when the user wants to publish a meetup, says "upload the meetup", "publish the recording", "process the Zoom recording for YouTube", or mentions uploading an AGENCY Community session. Also triggers on requests to add intro/outro to a meeting recording and upload it.
npx skills add https://github.com/glebis/claude-skills --skill agency-meetup-publish
Publish AGENCY Community meetup recordings to YouTube with intro, thumbnail, description, and timecodes.
~/ai_projects/youtube-uploader/ — YouTube upload scripts with OAuth credentials~/ai_projects/my-video/out/agency-swarm-intro.mp4 — AGENCY intro animation (6s, 1920x1080)~/.zoom_credentials/ffmpeg and ffprobe installed1. Identify meeting → 2. Download from Zoom → 3. Add intro/outro
→ 4. Generate timecodes → 5. Write description → 6. Create thumbnail
→ 7. Upload to YouTube → 8. Set thumbnail → 9. Add to playlist
Ask the user for:
python3 ~/.claude/skills/zoom/scripts/zoom_meetings.py recordings --start YYYY-MM-DD
Get recording details:
python3 ~/.claude/skills/zoom/scripts/zoom_meetings.py recording MEETING_ID
This returns MP4 download URL, duration, transcript URL, and other files.
Download MP4 and VTT transcript in parallel:
# Video (run in background — large file)
curl -L -o ~/Brains/brain/YYYYMMDD-meeting-slug.mp4 "DOWNLOAD_URL"
# Transcript
curl -L -o ~/Brains/brain/YYYYMMDD-meeting-slug.vtt "TRANSCRIPT_URL"
Naming convention: YYYYMMDD-meeting-slug.mp4 where slug is a kebab-case topic summary.
The intro and meeting likely have different specs. Check both:
ffprobe -v quiet -print_format json -show_streams INTRO.mp4
ffprobe -v quiet -print_format json -show_streams MEETING.mp4
Key parameters to match: resolution, fps, audio sample rate, audio channels.
ffmpeg -y -i ~/ai_projects/my-video/out/agency-swarm-intro.mp4 \
-vf "scale=WIDTH:HEIGHT:force_original_aspect_ratio=decrease,pad=WIDTH:HEIGHT:(ow-iw)/2:(oh-ih)/2:black" \
-r FPS -c:v libx264 -preset fast -crf 18 \
-ar SAMPLE_RATE -ac CHANNELS -c:a aac \
/tmp/intro-matched.mp4
Review the VTT to find where real content begins. Typically trim 1-3 seconds of silence:
ffmpeg -y -ss TRIM_SECONDS -i MEETING.mp4 \
-c:v libx264 -preset fast -crf 18 \
-ar SAMPLE_RATE -ac CHANNELS -c:a aac \
-r FPS -vf "scale=WIDTH:HEIGHT" \
/tmp/meeting-trimmed.mp4
This re-encode is necessary for concat compatibility. Run in background — it takes several minutes for long recordings.
echo "file '/tmp/intro-matched.mp4'" > /tmp/concat-list.txt
echo "file '/tmp/meeting-trimmed.mp4'" >> /tmp/concat-list.txt
# If outro exists:
# echo "file '/tmp/outro-matched.mp4'" >> /tmp/concat-list.txt
ffmpeg -y -f concat -safe 0 -i /tmp/concat-list.txt -c copy \
~/ai_projects/my-video/out/YYYYMMDD-meeting-slug-final.mp4
Read the VTT transcript and identify up to 20 topic transitions. Look for:
Important: Timecodes must account for the intro offset. Add the intro duration (typically 6s) to all VTT timestamps.
Format: MM:SS Topic description or H:MM:SS for videos over 1 hour.
Follow the template from previous AGENCY Community uploads. See references/description-template.md for the full template.
Key sections:
AGENCY Community Meetup: [Topic]⏱ Таймкоды:AGENCY Community — сообщество практиков AI-автоматизации.#AGENCY #CommunitySave description to /tmp/youtube-description.txt.
Use the AGENCY thumbnail HTML template rendered to 1280x720 PNG.
Write an HTML file at /tmp/thumbnail.html based on references/thumbnail-template.html. Customize:
Speaker Name × AGENCYmix-blend-mode: hard-lightPreferred: headless Chrome (no install needed):
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
--headless --screenshot=/tmp/thumbnail.png \
--window-size=1280,720 --hide-scrollbars \
"file:///tmp/thumbnail.html"
Fallback: Playwright:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page(viewport={'width': 1280, 'height': 720})
page.goto('file:///tmp/thumbnail.html')
page.wait_for_timeout(2000)
page.screenshot(path='/tmp/thumbnail.png')
browser.close()
cd ~/ai_projects/youtube-uploader && python3 youtube_upload.py \
--video ~/ai_projects/my-video/out/FINAL.mp4 \
--title "TITLE" \
--description "$(cat /tmp/youtube-description.txt)" \
--category education \
--privacy public \
--tags "TAG1,TAG2,..." \
--yes
The upload script outputs the Video ID and Video URL on success. Capture these for the next steps.
Title guidelines: Keep under 100 chars. Format: Topic — Speaker Name. Include key terms for search.
cd ~/ai_projects/youtube-uploader && \
python3 youtube_manage.py thumbnails set VIDEO_ID /tmp/thumbnail.png
The AGENCY Community playlist ID is PLZNP0SKU2SqjHOy01UjDxhSRtcluvuw0m.
cd ~/ai_projects/youtube-uploader && \
python3 youtube_manage.py playlists add-item PLZNP0SKU2SqjHOy01UjDxhSRtcluvuw0m VIDEO_ID
For speed, run these in parallel where possible:
| Phase | Can parallelize with |
|-------|---------------------|
| Download MP4 | Download VTT |
| Re-encode meeting (bg) | Read transcript, draft timecodes |
| Upload to YouTube (bg) | Generate thumbnail |
| Set thumbnail | Add to playlist |
Report to the user:
https://www.youtube.com/watch?v=VIDEO_IDhttps://studio.youtube.com/video/VIDEO_ID/editThis pipeline builds on:
~/.claude/skills/zoom/ for Zoom recording access~/.claude/skills/video-youtube-upload/ for upload reference~/.claude/skills/youtube/ for post-upload management~/.claude/skills/agency-socials/ for cover design system reference> This skill applies brand guidelines to content creation. It should be used when the user asks to "write an email", "draft a proposal", "create a pitch deck", "write a LinkedIn post", "draft a presentation", "write a Slack message", "draft sales content", or any content creation request where brand voice should be applied. Also triggers on "on-brand", "brand voice", "enforce voice", "apply brand guidelines", "brand-aligned content", "write in our voice", "use our brand tone", "make this sound like us", "rewrite this in our tone", or "this doesn't sound on-brand". Not for generating guidelines from scratch (use guideline-generation) or discovering brand materials (use discover-brand).
This skill should be used when the user asks to "write a post", "check my voice", "look up contact", "prepare for meeting", "weekly review", "track goals", or mentions personal brand, content creation, network management, or voice consistency.
Generate configurable chat motion overlays from a transcript or screenshot, including plain bubble scenes, app-style chat containers, optional device frames, preset or uploaded avatars, nickname display rules, and transparent-video-ready Remotion bundles. Use when Codex needs to create reusable short-form chat clips for Douyin, demo videos, story reenactments, social-message proof scenes, or embeddable alpha overlays for Hyperframe and Remotion workflows.
Realistic macOS notification banner with app icon, title, and body, suited to video overlays or product teasers.
Review content against your brand voice, style guide, and messaging pillars, flagging deviations by severity with specific before/after fixes. Use when checking a draft before it ships, when auditing copy for voice consistency and terminology, or when screening for unsubstantiated claims, missing disclaimers, and other legal flags.
List recent meetings and voice memos. Use when the user asks "what meetings did I have", "show my recent recordings", "any meetings today", "list my voice memos", or wants an overview of their meeting history. Also use when they need to find a specific meeting by browsing rather than searching.
List recent meetings and voice memos. Use when the user asks "what meetings did I have", "show my recent recordings", "any meetings today", "list my voice memos", or wants an overview of their meeting history. Also use when they need to find a specific meeting by browsing rather than searching.
Start or stop recording a meeting, call, or voice memo. Use this whenever the user says "record", "start recording", "capture this meeting", "stop recording", "I'm in a meeting", "take notes on this call", or wants to transcribe live audio. Also use when they ask about recording status or want to know if something is being recorded.
Take glebis/agency-meetup-publish from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.