agency-meetup-publish/SKILL.md
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 skillsauth add glebis/claude-skills agency-meetup-publishInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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 referencedevelopment
This skill should be used when designing, running, validating, or auditing statistical experiments on personal or observational time-series data (health metrics, speech/text corpora, behavioral logs, diaries, n-of-1 self-tracking). It enforces pre-registration, exact permutation tests, FDR discipline, data-validation gates, adversarial code review, and cross-validation with external models. Triggers on "design an experiment", "test this hypothesis on my data", "is this correlation real", "audit these findings", "pre-register", "validate this dataset", or any n-of-1 / quantified-self analysis request.
development
Create Tufte-inspired data reports and infographic dashboards as standalone HTML files. Uses EB Garamond for text, Monaspace Argon for numbers, Chart.js for interactive charts, and inline SVG sparklines. Produces publication-quality reports with 2-column narrative+data layouts, status dashboards, scroll animations, and responsive mobile support. Use this skill whenever the user wants to create a data report, activity dashboard, infographic, personal analytics page, health tracker visualization, or any document that combines narrative text with interactive charts and tables. Also triggers for "make a report like Tufte", "create an infographic", "build a dashboard", "visualize my data", or requests for beautiful data-driven documents.
documentation
Cut a software release and maintain a tiered compatibility policy. Use when the user wants to release, ship a version, bump the version, tag a release, write a changelog, or update COMPATIBILITY. Config-driven via release.config.json; bumps version files, runs a readiness gate, updates COMPATIBILITY.md tiers and deprecations, tags (→ release workflow), and reports closed issues. Teaches the underlying standards as it runs.
development
Sync and manage bilingual (EN/RU) library content for agency-docs. Use when adding, updating, or reviewing library articles. Handles translation, sync checks, and Russian stylistic review.