Content Pipeline Skill
Automated content creation from idea to publication across all platforms.
When to Use
- User asks to create, generate, or publish content
- Scheduled content generation tasks
- Research trending topics and create content around them
- Repurpose existing content across platforms
Prerequisites
yt-dlp installed (pipx install yt-dlp)
ffmpeg available at /home/dima/bin/ffmpeg
moviepy Python package (в venv при PEP 668 — python3 -m venv venv && venv/bin/pip install moviepy)
pillow Python package
- Telegram bot token configured in
.env
- Python 3.14+ с PEP 668: используй
pip install --user или venv для пакетов
Content Types Supported
1. Short-form Video (YouTube Shorts, TikTok, Instagram Reels)
Pipeline: Idea → Script → TTS → Visuals → Subtitles → Video → Upload
2. Blog Posts / Articles
Pipeline: Research → Outline → Write → SEO → Publish
3. Telegram Posts
Pipeline: Topic → Write → Format → Post to channel
Manual: @Wb_daybot scheduling bot. See references/telegram-tutorial-series.md — 6-post template with beginner-friendly writing rules.
Programmatic (Bot API): publish_posts.py — publishes posts with images directly via Telegram Bot API. Handles sendPhoto caption splitting (1024 char limit), rate limiting, and dry-run mode. Requires bot as channel admin. See references/telegram-bot-api-publishing.md for API limits, pitfalls, and usage.
4. Image Content (Instagram, Pinterest)
Pipeline: Idea → Generate/Design → Caption → Post
5. Thread Content (X/Twitter)
Pipeline: Topic → Research → Thread draft → Post
Procedure
Step 1: Research Trends
1. Use web_search to find trending topics in the niche
2. Check competitor content via web_extract
3. Identify high-engagement formats
Step 2: Generate Script/Content
1. Create outline based on research
2. Write full script with hooks and CTAs
3. Add monetization touchpoints (affiliate links, product mentions)
Step 3: Create Visuals
For AI video (priority — «кровь из носа»):
- **OmniRoute video models** (порт 3000) — Veo, WAN, Pollinations (требуют Hysteria прокси)
- **Hugging Face Spaces** — Stable Video Diffusion, LTX-Video, Instant-Video (бесплатные GPU)
- **Gemini AI Studio** → Veo 2 (1500 запросов/день, 3 аккаунта)
- **Pipeline v3** — `~/.hermes/tools/pipeline.py` — слайд-шоу из Pollinations картинок + TTS + субтитры + Ken Burns.
- **Кадры:** тёмные градиенты + glow-эффекты + крупный текст (Pillow), каждый с уникальной Pollinations-иллюстрацией
- **Ken Burns zoompan** — замена `loop+setpts` на `zoompan`:
```
[{i}:v]scale=2160:-2:force_original_aspect_ratio=increase,\
crop=2160:3840,\
zoompan=z='1.0+0.0003*on':d={seg_frames}:x='iw/2-(iw/zoom/2)':\
y='ih/2-(ih/zoom/2)':s=1080x1920:fps=30,format=yuv420p[z{i}]
```
Метки выхода — `[z0]`, `[z1]`, ... (а не `[v{i}]`), чтобы передать их в xfade цепочку.
- **Чётные кадры** — zoom in (z=1.0→1.1 за ~10с), **нечётные** — панорамирование влево/вправо + лёгкий зум
- **2x resolution** для zoompan (2160×3840), zoompan ресайзит обратно в 1080×1920 → без пикселизации при зуме
- **Crossfade между кадрами (xfade)** — плавные переходы вместо резких стыков. Цепочка: `[z0][z1]xfade=transition=fade:duration=...:offset=...[f1];[f1][z2]xfade=...`. Метки: `f1`, `f2`, ..., последний → `vid`. Формула offset: `offset_frames = i * (seg_frames - fade_duration)`, где `i` — номер перехода (1-based), `fade_duration` ~ 30 кадров/1с. Пример: `[z0][z1]xfade=transition=fade:duration=1.00:offset=5.17[f1];[f1][z2]xfade=transition=fade:duration=1.00:offset=10.33[vid]`.
- Детали xfade: `references/crossfade-xfade.md`
- **Голос:** мужской — `ru-RU-DmitryNeural` (русский) / `en-US-GuyNeural` (английский)
- **Скрипт:** названия сервисов пишутся **латиницей** (ChatGPT, Midjourney, Claude, Veo 2) даже в русскоязычном тексте
- **Субтитры:** Whisper (`faster-whisper`) → `fix_subtitle_text()` — словарь замен для AI-моделей (см. раздел Subtitle Correction)
- `httpx.AsyncClient(trust_env=False)` — HTTP_PROXY из env перехватывает локальные запросы к OmniRoute
- OmniRoute возвращает SSE (`data: {...}`, `data: [DONE]`) даже при `stream: false`
- Детали zoompan: `references/ken-burns-zoompan.md`
- Полные детали всех подходов: `references/free-video-sources.md`
For slideshow/background video:
- Use pillow to create title cards and thumbnails
- Use moviepy to compose video from clips
- Add TTS voiceover via faster-whisper (for STT) or external TTS
- Add subtitles using ffmpeg ASS/SRT
- **Backgrounds:** Pollinations free image API (бесплатно, без ключа) или Pexels API (200 req/h free) или gradient (offline)
**Pollinations free image (для кадров в pipeline.py):**
- Эндпоинт: `https://image.pollinations.ai/prompt/{url_encoded_prompt}`
- Старый `pollinations.ai/p/` больше НЕ РАБОТАЕТ (возвращает HTML вместо JPEG)
- Формат: JPEG (первые 2 байта `\\xff\\xd8`), ~85‑170 KB
- Через Hysteria прокси: `httpx.Client(proxy='http://127.0.0.1:1082')`
- Rate limit: **~1 req / 7 sec** (429 при быстрее) → `time.sleep(7)` между запросами
- Таймаут: 45+ секунд (иногда долго генерирует)
- Валидация: проверять `status_code == 200 and len(content) > 1000`
- **ПРОМПТ: НИКАКИХ ЛЮДЕЙ И ЛИЦ.** Генерация лиц у Pollinations даёт криповые/уродливые результаты. Всегда явно указывать в промпте: `no people, no faces, no characters — only abstract futuristic technology background, holographic UI, glowing circuits, data streams, sci-fi interface style, octane render`. Без этого — гарантированный nightmarish результат. Если промпт обрезается по длине — первым удалять упоминания людей/персонажей, последним — ключевые техно-слова (glowing, circuits, holographic).
- Длина промпта: до ~200 символов (при обрезке сохранять суть: техно-арт, без людей)
- Детали: `references/free-image-sources-pollinations.md`
- Pollinations не требует регистрации, ключа или cookie — нулевой риск блокировки
For images:
- Generate with ComfyUI skill or pillow
- Add text overlays, branding
- **Free gen:** doubao2api, imageFX-api (см. free-visual-sources.md)
- **Ресурсы:**
- `references/free-visual-sources.md` — стоковые видео-фоны, изображения (Pexels, doubao2api, imageFX-api)
- `references/free-video-sources.md` — AI генерация видео (OmniRoute, HF Spaces, Gemini Veo 2, Pipeline 2.0)
- `references/video-models-omniroute.md` — 31 видео-модель в OmniRoute (Veo, WAN, Seedance, Grok Video Pro), тесты и риски
- `references/content-pipeline-tools-landscape.md` — обзор GitHub репозиториев для контента (сравнение, звёзды, совместимость со стеком), методология self-improving loop (LLM-as-a-judge, A/B тестирование, analytics-driven feedback)
### Step 4: Publish
For Telegram:
- Use Telegram bot API (already configured)
- Send to channel with media
For YouTube:
- Use YouTube Data API v3 (needs API key)
- Upload with metadata
For X/Twitter:
- Use xurl skill (already installed)
For Dev.to:
- Full article: POST /api/articles with api-key and Accept header to create a draft
- CRITICAL:
published: true on POST is IGNORED by the API — always creates a draft
- To publish: PUT /api/articles/{id} with
published: true in the body
- Auth: api-key from dev.to settings, NOT OAuth
- Always route through Hysteria HTTP proxy (http://127.0.0.1:1082) — SOCKS5 (1081) resets
- Python+curl pipe via file (JSON to stdin) — Harvest is NOT used for API calls
- Before writing: study top Dev.to articles in t/showdev for patterns. See references/devto-publishing.md for full workflow.
- Detailed API reference: references/devto-publishing.md
For Reddit:
- Post strategy: honest approach, no clickbait, genuine value
- Cross-post sequencing: opensource/selfhosted first → programming later
- Detailed guide: references/reddit-post-strategy.md
For GitHub Releases:
- Fully autonomous —
gh release create / gh release edit
- Gets indexed by search engines immediately
- Good fallback when all social channels need manual auth
- Include feature highlights, benchmarks, and donation links in body
For Hacker News:
- Show HN — best single source for open-source projects
- HN blocks via Cloudflare — no programmatic access through proxy
- Manual submission required (phone or real browser)
- Format:
Show HN: Project – description + URL to GitHub
For X/Twitter:
- Use xurl skill (already installed)
- Short honest post with link to GitHub
For Hacker News (Show HN):
- Best for open-source projects — highest quality traffic
- Submit via https://news.ycombinator.com/submit
- Format: Show HN: Harvest – open-source web scraper with self-healing parsers, semantic cache, MCP server
- URL: GitHub repo
- Manual only — Cloudflare blocks programmatic access
- New accounts cannot submit URLs — need karma or email hn@ycombinator.com
- HN API is READ-ONLY — no write endpoints
- Detailed guide: references/hackernews-publishing.md
Full platform autonomy map: references/platform-autonomy-map.md
For X/Twitter:
- Use xurl skill (already installed)
- Short honest post with link to GitHub
- On headless/WSL2: use
xurl auth oauth2 --app <name> <user> --headless for OAuth
- Detailed guide: references/hackernews-publishing.md (xurl section)
Step 5: Track Performance
1. Log published content to ~/content_output/tracker.json
2. Track views, engagement per platform
3. Report weekly via cron
Step 6: Self-Improving Quality Loop (LLM-as-a-Judge)
Цель: каждый следующий ролик качественнее предыдущего. Не публиковать до оценки.
1. LLM-as-a-Judge: после генерации отправить метрики (длительность, кол-во кадров, score от LLM) на оценку через OmniRoute
- Критерии: качество визуала, читаемость субтитров, плавность переходов, вовлекающий hook, синхронизация аудио/видео
- Score 0-10. Если < 7 — корректировать промпты и перезапустить
- Если >= 7 — публиковать и записать в историю
2. Хранить историю: ~/content_output/quality_history.json (50 последних записей)
3. A/B варианты: если время позволяет — генерировать 2 варианта скрипта/промпта, выбирать лучший по LLM-judge
4. Analytics feedback: после публикации (когда появятся просмотры/удержание) — учитывать что сработало для следующего цикла
Детали: references/content-pipeline-tools-landscape.md (раздел Self-Improving Loop)
## Quick Reference Commands
```bash
# Download video for remixing
yt-dlp -f "best[height<=720]" -o "%(title)s.%(ext)s" <URL>
# Extract audio for TTS reference
ffmpeg -i input.mp4 -vn -acodec pcm_s16le audio.wav
# Create short video from images
ffmpeg -framerate 1 -i img%d.png -c:v libx264 -pix_fmt yuv420p output.mp4
# Add subtitles to video
ffmpeg -i video.mp4 -vf "subtitles=subs.srt:force_style='FontSize=24'" output.mp4
# Resize for vertical (9:16)
ffmpeg -i input.mp4 -vf "crop=ih*9/16:ih" -c:v libx264 vertical.mp4
Pitfalls
- YouTube API requires OAuth2 setup — not just API key
- Instagram blocks automation — use sparingly, add delays
- Telegram has 50MB file size limit for bots — compress if needed
- Always add your watermark/branding to content
- Track which content performs best to double down on winners
- httpx.AsyncClient подхватывает
HTTP_PROXY/HTTPS_PROXY/http_proxy из env без спроса. При работе через локальный сервис (OmniRoute на localhost) всегда передавать trust_env=False или proxies=None при создании клиента. Иначе запросы валятся в прокси, а не на localhost.
- ffmpeg concat с
-c:v copy НЕ работает для PNG-кадров — нет keyframe для стрим-копи. Решение: использовать filter_complex loop+concat — каждый PNG лупится N раз (loop=N:1:0,setpts=N/30/TB), scale+pad в фильтре, concat в конце. Пример: [0:v]scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2,loop=240:1:0,setpts=N/30/TB,format=yuv420p[v0] + [v0][v1]...[vN]concat=n=N:v=1:a=0[vid]. Работает без segfault и без промежуточных файлов.
- OmniRoute возвращает SSE (
data: {...}) даже при stream: false. Парсер должен искать data: префиксы, а не просто голый JSON в теле ответа.
- fact_store — agent tool, не Python модуль. В скриптах (pipeline.py, deerflow, и т.д.) НЕЛЬЗЯ импортировать
from hermes_tools_lib import fact_store или from fact_store import fact_store — этих модулей нет. Для логирования из скриптов используй knowledge_base (есть как модуль) или пиши в ~/content_output/tracker.json. Hermes-агент записывает в fact_store через свой встроенный tool.
- Research before acting. Если задача новая или неочевидная — сначала
web_search/web_extract, потом команды. Не тыкать случайными командами. «По смыслу почему не ищешь» означает: сначала изучи, потом делай.
- Edge-TTS на русском: предпочтительный голос ru-RU-DmitryNeural (мужской, естественнее женского SvetlanaNeural). На английском — en-US-GuyNeural. Устанавливать
edge-tts через pip.
- Скрипт: названия сервисов, инструментов и AI-моделей всегда писать латиницей (ChatGPT, Midjourney, Claude, Veo 2, Suno, FLUX), даже в русскоязычном тексте. Не транслитерировать («Чат-ДжиПиТи», «Мижурни»).
- Subtitle Correction (Whisper→Latin): Whisper (
faster-whisper) транскрибирует английские названия AI-моделей как русские近似жения («дип сик» → DeepSeek, «люма» → Luma). Обязательно применять fix_subtitle_text() — словарь замен:replacements = {
"чат джи пи ти": "ChatGPT",
"дип сик": "DeepSeek",
"люма": "Luma", "люмы": "Luma", "люме": "Luma", "люму": "Luma",
"люма дреам машин": "Luma Dream Machine", # и все падежные варианты
"соpa 2": "Sora 2",
"опен ай": "OpenAI",
"миджорни": "Midjourney",
"стабил дифьюжн": "Stable Diffusion",
"клод": "Claude", "антропик": "Anthropic",
"вейо 3": "Veo 3",
"грок": "Grok",
"ниантропик": "Anthropic",
"стабил": "Stable",
"дип си": "DeepSeek",
}
Замены сортируются по длине (сначала длинные, потом короткие), чтобы полные фразы не разбивались на части. Варианты в разных падежах (люмы, люме, люму) — каждый отдельной строкой.
- User preference: каждый кадр динамичен. Никаких статичных картинок. Каждый слайд в Pipeline v3 должен иметь движение (zoom in/out, pan). Использовать ffmpeg
zoompan filter для Ken Burns эффекта: scale→crop в 2× разрешение, затем zoompan с чередующимися типами движения (zoom-in на чётных, pan на нечётных). Это базовое ожидание качества, не опция.
- User preference: названия AI-моделей в субтитрах только латиницей. Whisper часто ошибается, транскрибируя их по-русски.
fix_subtitle_text() — обязательный шаг в пайплайне, без него видео выглядит непрофессионально.
- User preference: проверяй качество сам. Пользователь не хочет указывать на очевидные проблемы. Перед тем как показать результат — сам проверь: (1) нет ли кривых лиц на картинках, (2) читаются ли субтитры, (3) есть ли движение в кадрах, (4) нормально ли синхронизирован звук. Если проблема очевидна — чини ДО показа, не жди пока укажут. "Ты сам должен видеть что не так."
- Dev.to API
published field is create-only AND PUT may silently fail. POST always creates draft (documented). PUT with published: true sometimes also returns published: None — caused by duplicate titles, rate limiting, or recent similar drafts. Fallback: publish manually via Dev.to web UI (Dashboard → Posts → Edit → Publish). Before creating: check for existing drafts with similar titles and delete them. See references/devto-publishing.md.
- Telegram
sendPhoto caption limit is 1024 chars, not 4096. Posts longer than 1024 chars must be split: photo with truncated caption + separate sendMessage for full text. This catches everyone the first time. See references/telegram-bot-api-publishing.md.
async def without await silently does nothing. Python returns a coroutine object and prints RuntimeWarning, but the function never executes. If a publish/discover function seems to return empty results, check it's not async def when called synchronously.
- HN new accounts cannot submit URLs. Error: "Sorry, your account isn't able to submit this site." Need karma or email hn@ycombinator.com. See
references/hackernews-publishing.md.
- xurl on headless/WSL2 requires
--headless flag for OAuth2. Without it, xurl tries to open a browser and times out. Use: xurl auth oauth2 --app <name> <username> --headless — user opens URL on phone, pastes code back. See references/hackernews-publishing.md.
- Research before building — особенно для визуала. Если делаешь контент с визуальным рядом — сначала изучи методологию: как правильно делать такие видео, какие приёмы работают, какие нет. web_search по "faceless video methodology", "ken burns effect tutorial", "video hook strategies", "best background for text shorts". Не тупи — сперва исследуй, потом делай. Пользователь явно просил: "Изучи методологию как правильно делать такие видео", "Правь методологию изучай интернет".
- HF Spaces Gradio 5 — POST
/gradio_api/call/{fn} работает (event_id), но WebSocket /gradio_api/queue/join возвращает 403 из РФ. Результат без WS не получить. Решение: браузерная автоматизация (Scrapling/Playwright) через SOCKS5 прокси. Детали: references/free-video-sources.md (раздел "Hugging Face Spaces / Решение: браузерная автоматизация")
Monetization Touchpoints
- YouTube: Ad revenue, affiliate links in description, sponsorships
- Telegram: Paid channel, affiliate, digital products
- Blog: AdSense, affiliate, sponsored posts
- Instagram: Brand deals, affiliate, product sales
- X/Twitter: Monetization program, affiliate, consulting leads
1---2name: content-pipeline3description: End-to-end content creation from idea to monetization.4license: MIT5---67# Content Pipeline Skill89Automated content creation from idea to publication across all platforms.1011## When to Use1213- User asks to create, generate, or publish content14- Scheduled content generation tasks15- Research trending topics and create content around them16- Repurpose existing content across platforms1718## Prerequisites1920- `yt-dlp` installed (`pipx install yt-dlp`)21- `ffmpeg` available at `/home/dima/bin/ffmpeg`22- `moviepy` Python package (в venv при PEP 668 — `python3 -m venv venv && venv/bin/pip install moviepy`)23- `pillow` Python package24- Telegram bot token configured in `.env`25- Python 3.14+ с PEP 668: используй `pip install --user` или `venv` для пакетов2627## Content Types Supported2829### 1. Short-form Video (YouTube Shorts, TikTok, Instagram Reels)30Pipeline: Idea → Script → TTS → Visuals → Subtitles → Video → Upload3132### 2. Blog Posts / Articles33Pipeline: Research → Outline → Write → SEO → Publish3435### 3. Telegram Posts36Pipeline: Topic → Write → Format → Post to channel3738**Manual:** @Wb_daybot scheduling bot. See `references/telegram-tutorial-series.md` — 6-post template with beginner-friendly writing rules.3940**Programmatic (Bot API):** `publish_posts.py` — publishes posts with images directly via Telegram Bot API. Handles sendPhoto caption splitting (1024 char limit), rate limiting, and dry-run mode. Requires bot as channel admin. See `references/telegram-bot-api-publishing.md` for API limits, pitfalls, and usage.4142### 4. Image Content (Instagram, Pinterest)43Pipeline: Idea → Generate/Design → Caption → Post4445### 5. Thread Content (X/Twitter)46Pipeline: Topic → Research → Thread draft → Post4748## Procedure4950### Step 1: Research Trends51```521. Use web_search to find trending topics in the niche532. Check competitor content via web_extract543. Identify high-engagement formats55```5657### Step 2: Generate Script/Content58```591. Create outline based on research602. Write full script with hooks and CTAs613. Add monetization touchpoints (affiliate links, product mentions)62```6364### Step 3: Create Visuals65```66For AI video (priority — «кровь из носа»):67 - **OmniRoute video models** (порт 3000) — Veo, WAN, Pollinations (требуют Hysteria прокси)68 - **Hugging Face Spaces** — Stable Video Diffusion, LTX-Video, Instant-Video (бесплатные GPU)69 - **Gemini AI Studio** → Veo 2 (1500 запросов/день, 3 аккаунта)70 - **Pipeline v3** — `~/.hermes/tools/pipeline.py` — слайд-шоу из Pollinations картинок + TTS + субтитры + Ken Burns.71 - **Кадры:** тёмные градиенты + glow-эффекты + крупный текст (Pillow), каждый с уникальной Pollinations-иллюстрацией72 - **Ken Burns zoompan** — замена `loop+setpts` на `zoompan`:73 ```74 [{i}:v]scale=2160:-2:force_original_aspect_ratio=increase,\75 crop=2160:3840,\76 zoompan=z='1.0+0.0003*on':d={seg_frames}:x='iw/2-(iw/zoom/2)':\77 y='ih/2-(ih/zoom/2)':s=1080x1920:fps=30,format=yuv420p[z{i}]78 ```79 Метки выхода — `[z0]`, `[z1]`, ... (а не `[v{i}]`), чтобы передать их в xfade цепочку.80 - **Чётные кадры** — zoom in (z=1.0→1.1 за ~10с), **нечётные** — панорамирование влево/вправо + лёгкий зум81 - **2x resolution** для zoompan (2160×3840), zoompan ресайзит обратно в 1080×1920 → без пикселизации при зуме82 - **Crossfade между кадрами (xfade)** — плавные переходы вместо резких стыков. Цепочка: `[z0][z1]xfade=transition=fade:duration=...:offset=...[f1];[f1][z2]xfade=...`. Метки: `f1`, `f2`, ..., последний → `vid`. Формула offset: `offset_frames = i * (seg_frames - fade_duration)`, где `i` — номер перехода (1-based), `fade_duration` ~ 30 кадров/1с. Пример: `[z0][z1]xfade=transition=fade:duration=1.00:offset=5.17[f1];[f1][z2]xfade=transition=fade:duration=1.00:offset=10.33[vid]`.83 - Детали xfade: `references/crossfade-xfade.md`84 - **Голос:** мужской — `ru-RU-DmitryNeural` (русский) / `en-US-GuyNeural` (английский)85 - **Скрипт:** названия сервисов пишутся **латиницей** (ChatGPT, Midjourney, Claude, Veo 2) даже в русскоязычном тексте86 - **Субтитры:** Whisper (`faster-whisper`) → `fix_subtitle_text()` — словарь замен для AI-моделей (см. раздел Subtitle Correction)87 - `httpx.AsyncClient(trust_env=False)` — HTTP_PROXY из env перехватывает локальные запросы к OmniRoute88 - OmniRoute возвращает SSE (`data: {...}`, `data: [DONE]`) даже при `stream: false`89 - Детали zoompan: `references/ken-burns-zoompan.md`90 - Полные детали всех подходов: `references/free-video-sources.md`9192For slideshow/background video:93 - Use pillow to create title cards and thumbnails94 - Use moviepy to compose video from clips95 - Add TTS voiceover via faster-whisper (for STT) or external TTS96 - Add subtitles using ffmpeg ASS/SRT97 - **Backgrounds:** Pollinations free image API (бесплатно, без ключа) или Pexels API (200 req/h free) или gradient (offline)9899 **Pollinations free image (для кадров в pipeline.py):**100 - Эндпоинт: `https://image.pollinations.ai/prompt/{url_encoded_prompt}`101 - Старый `pollinations.ai/p/` больше НЕ РАБОТАЕТ (возвращает HTML вместо JPEG)102 - Формат: JPEG (первые 2 байта `\\xff\\xd8`), ~85‑170 KB103 - Через Hysteria прокси: `httpx.Client(proxy='http://127.0.0.1:1082')`104 - Rate limit: **~1 req / 7 sec** (429 при быстрее) → `time.sleep(7)` между запросами105 - Таймаут: 45+ секунд (иногда долго генерирует)106 - Валидация: проверять `status_code == 200 and len(content) > 1000`107 - **ПРОМПТ: НИКАКИХ ЛЮДЕЙ И ЛИЦ.** Генерация лиц у Pollinations даёт криповые/уродливые результаты. Всегда явно указывать в промпте: `no people, no faces, no characters — only abstract futuristic technology background, holographic UI, glowing circuits, data streams, sci-fi interface style, octane render`. Без этого — гарантированный nightmarish результат. Если промпт обрезается по длине — первым удалять упоминания людей/персонажей, последним — ключевые техно-слова (glowing, circuits, holographic).108 - Длина промпта: до ~200 символов (при обрезке сохранять суть: техно-арт, без людей)109 - Детали: `references/free-image-sources-pollinations.md`110 - Pollinations не требует регистрации, ключа или cookie — нулевой риск блокировки111112For images:113 - Generate with ComfyUI skill or pillow114 - Add text overlays, branding115 - **Free gen:** doubao2api, imageFX-api (см. free-visual-sources.md)116117- **Ресурсы:**118 - `references/free-visual-sources.md` — стоковые видео-фоны, изображения (Pexels, doubao2api, imageFX-api)119 - `references/free-video-sources.md` — AI генерация видео (OmniRoute, HF Spaces, Gemini Veo 2, Pipeline 2.0)120 - `references/video-models-omniroute.md` — 31 видео-модель в OmniRoute (Veo, WAN, Seedance, Grok Video Pro), тесты и риски121 - `references/content-pipeline-tools-landscape.md` — обзор GitHub репозиториев для контента (сравнение, звёзды, совместимость со стеком), методология self-improving loop (LLM-as-a-judge, A/B тестирование, analytics-driven feedback)122123### Step 4: Publish124```125For Telegram:126 - Use Telegram bot API (already configured)127 - Send to channel with media128129For YouTube:130 - Use YouTube Data API v3 (needs API key)131 - Upload with metadata132133For X/Twitter:134 - Use xurl skill (already installed)135136For Dev.to:137 - Full article: POST /api/articles with api-key and Accept header to create a draft138 - CRITICAL: `published: true` on POST is IGNORED by the API — always creates a draft139 - To publish: PUT /api/articles/{id} with `published: true` in the body140 - Auth: api-key from dev.to settings, NOT OAuth141 - Always route through Hysteria HTTP proxy (http://127.0.0.1:1082) — SOCKS5 (1081) resets142 - Python+curl pipe via file (JSON to stdin) — Harvest is NOT used for API calls143 - Before writing: study top Dev.to articles in t/showdev for patterns. See references/devto-publishing.md for full workflow.144 - Detailed API reference: references/devto-publishing.md145146For Reddit:147 - Post strategy: honest approach, no clickbait, genuine value148 - Cross-post sequencing: opensource/selfhosted first → programming later149 - Detailed guide: references/reddit-post-strategy.md150151For GitHub Releases:152 - Fully autonomous — `gh release create` / `gh release edit`153 - Gets indexed by search engines immediately154 - Good fallback when all social channels need manual auth155 - Include feature highlights, benchmarks, and donation links in body156157For Hacker News:158 - Show HN — best single source for open-source projects159 - HN blocks via Cloudflare — no programmatic access through proxy160 - Manual submission required (phone or real browser)161 - Format: `Show HN: Project – description` + URL to GitHub162 For X/Twitter:163 - Use xurl skill (already installed)164 - Short honest post with link to GitHub165166 For Hacker News (Show HN):167 - Best for open-source projects — highest quality traffic168 - Submit via https://news.ycombinator.com/submit169 - Format: `Show HN: Harvest – open-source web scraper with self-healing parsers, semantic cache, MCP server`170 - URL: GitHub repo171 - Manual only — Cloudflare blocks programmatic access172 - **New accounts cannot submit URLs** — need karma or email hn@ycombinator.com173 - HN API is READ-ONLY — no write endpoints174 - Detailed guide: references/hackernews-publishing.md175176 **Full platform autonomy map:** references/platform-autonomy-map.md177178 For X/Twitter:179 - Use xurl skill (already installed)180 - Short honest post with link to GitHub181 - On headless/WSL2: use `xurl auth oauth2 --app <name> <user> --headless` for OAuth182 - Detailed guide: references/hackernews-publishing.md (xurl section)183 ## Step 5: Track Performance184185```1861. Log published content to ~/content_output/tracker.json1872. Track views, engagement per platform1883. Report weekly via cron189```190191### Step 6: Self-Improving Quality Loop (LLM-as-a-Judge)192193Цель: каждый следующий ролик качественнее предыдущего. Не публиковать до оценки.194195```1961. LLM-as-a-Judge: после генерации отправить метрики (длительность, кол-во кадров, score от LLM) на оценку через OmniRoute197 - Критерии: качество визуала, читаемость субтитров, плавность переходов, вовлекающий hook, синхронизация аудио/видео198 - Score 0-10. Если < 7 — корректировать промпты и перезапустить199 - Если >= 7 — публиковать и записать в историю2002012. Хранить историю: ~/content_output/quality_history.json (50 последних записей)2022033. A/B варианты: если время позволяет — генерировать 2 варианта скрипта/промпта, выбирать лучший по LLM-judge2042054. Analytics feedback: после публикации (когда появятся просмотры/удержание) — учитывать что сработало для следующего цикла206207Детали: references/content-pipeline-tools-landscape.md (раздел Self-Improving Loop)208209## Quick Reference Commands210211```bash212# Download video for remixing213yt-dlp -f "best[height<=720]" -o "%(title)s.%(ext)s" <URL>214215# Extract audio for TTS reference216ffmpeg -i input.mp4 -vn -acodec pcm_s16le audio.wav217218# Create short video from images219ffmpeg -framerate 1 -i img%d.png -c:v libx264 -pix_fmt yuv420p output.mp4220221# Add subtitles to video222ffmpeg -i video.mp4 -vf "subtitles=subs.srt:force_style='FontSize=24'" output.mp4223224# Resize for vertical (9:16)225ffmpeg -i input.mp4 -vf "crop=ih*9/16:ih" -c:v libx264 vertical.mp4226```227228## Pitfalls229230- YouTube API requires OAuth2 setup — not just API key231- Instagram blocks automation — use sparingly, add delays232- Telegram has 50MB file size limit for bots — compress if needed233- Always add your watermark/branding to content234- Track which content performs best to double down on winners235- **httpx.AsyncClient** подхватывает `HTTP_PROXY`/`HTTPS_PROXY`/`http_proxy` из env без спроса. При работе через локальный сервис (OmniRoute на localhost) всегда передавать `trust_env=False` или `proxies=None` при создании клиента. Иначе запросы валятся в прокси, а не на localhost.236- **ffmpeg concat** с `-c:v copy` НЕ работает для PNG-кадров — нет keyframe для стрим-копи. Решение: использовать **filter_complex loop+concat** — каждый PNG лупится N раз (`loop=N:1:0,setpts=N/30/TB`), scale+pad в фильтре, concat в конце. Пример: `[0:v]scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2,loop=240:1:0,setpts=N/30/TB,format=yuv420p[v0]` + `[v0][v1]...[vN]concat=n=N:v=1:a=0[vid]`. Работает без segfault и без промежуточных файлов.237- **OmniRoute** возвращает SSE (`data: {...}`) даже при `stream: false`. Парсер должен искать `data: ` префиксы, а не просто голый JSON в теле ответа.238- **fact_store — agent tool, не Python модуль.** В скриптах (pipeline.py, deerflow, и т.д.) НЕЛЬЗЯ импортировать `from hermes_tools_lib import fact_store` или `from fact_store import fact_store` — этих модулей нет. Для логирования из скриптов используй `knowledge_base` (есть как модуль) или пиши в `~/content_output/tracker.json`. Hermes-агент записывает в fact_store через свой встроенный tool.239- **Research before acting.** Если задача новая или неочевидная — сначала `web_search`/`web_extract`, потом команды. Не тыкать случайными командами. «По смыслу почему не ищешь» означает: сначала изучи, потом делай.240- **Edge-TTS** на русском: предпочтительный голос **ru-RU-DmitryNeural** (мужской, естественнее женского SvetlanaNeural). На английском — **en-US-GuyNeural**. Устанавливать `edge-tts` через pip.241- **Скрипт:** названия сервисов, инструментов и AI-моделей всегда писать **латиницей** (ChatGPT, Midjourney, Claude, Veo 2, Suno, FLUX), даже в русскоязычном тексте. Не транслитерировать («Чат-ДжиПиТи», «Мижурни»).242- **Subtitle Correction (Whisper→Latin):** Whisper (`faster-whisper`) транскрибирует английские названия AI-моделей как русские近似жения («дип сик» → DeepSeek, «люма» → Luma). Обязательно применять `fix_subtitle_text()` — словарь замен:243 ```python244 replacements = {245 "чат джи пи ти": "ChatGPT",246 "дип сик": "DeepSeek",247 "люма": "Luma", "люмы": "Luma", "люме": "Luma", "люму": "Luma",248 "люма дреам машин": "Luma Dream Machine", # и все падежные варианты249 "соpa 2": "Sora 2",250 "опен ай": "OpenAI",251 "миджорни": "Midjourney",252 "стабил дифьюжн": "Stable Diffusion",253 "клод": "Claude", "антропик": "Anthropic",254 "вейо 3": "Veo 3",255 "грок": "Grok",256 "ниантропик": "Anthropic",257 "стабил": "Stable",258 "дип си": "DeepSeek",259 }260 ```261 Замены сортируются по длине (сначала длинные, потом короткие), чтобы полные фразы не разбивались на части. Варианты в разных падежах (`люмы`, `люме`, `люму`) — каждый отдельной строкой.262- **User preference: каждый кадр динамичен.** Никаких статичных картинок. Каждый слайд в Pipeline v3 должен иметь движение (zoom in/out, pan). Использовать ffmpeg `zoompan` filter для Ken Burns эффекта: scale→crop в 2× разрешение, затем zoompan с чередующимися типами движения (zoom-in на чётных, pan на нечётных). Это базовое ожидание качества, не опция.263- **User preference: названия AI-моделей в субтитрах только латиницей.** Whisper часто ошибается, транскрибируя их по-русски. `fix_subtitle_text()` — обязательный шаг в пайплайне, без него видео выглядит непрофессионально.264- **User preference: проверяй качество сам.** Пользователь не хочет указывать на очевидные проблемы. Перед тем как показать результат — сам проверь: (1) нет ли кривых лиц на картинках, (2) читаются ли субтитры, (3) есть ли движение в кадрах, (4) нормально ли синхронизирован звук. Если проблема очевидна — чини ДО показа, не жди пока укажут. "Ты сам должен видеть что не так."265- **Dev.to API `published` field is create-only AND PUT may silently fail.** POST always creates draft (documented). PUT with `published: true` sometimes also returns `published: None` — caused by duplicate titles, rate limiting, or recent similar drafts. Fallback: publish manually via Dev.to web UI (Dashboard → Posts → Edit → Publish). Before creating: check for existing drafts with similar titles and delete them. See `references/devto-publishing.md`.266- **Telegram `sendPhoto` caption limit is 1024 chars, not 4096.** Posts longer than 1024 chars must be split: photo with truncated caption + separate `sendMessage` for full text. This catches everyone the first time. See `references/telegram-bot-api-publishing.md`.267- **`async def` without `await` silently does nothing.** Python returns a coroutine object and prints RuntimeWarning, but the function never executes. If a publish/discover function seems to return empty results, check it's not `async def` when called synchronously.268- **HN new accounts cannot submit URLs.** Error: "Sorry, your account isn't able to submit this site." Need karma or email hn@ycombinator.com. See `references/hackernews-publishing.md`.269- **xurl on headless/WSL2 requires `--headless` flag for OAuth2.** Without it, xurl tries to open a browser and times out. Use: `xurl auth oauth2 --app <name> <username> --headless` — user opens URL on phone, pastes code back. See `references/hackernews-publishing.md`.270- **Research before building — особенно для визуала.** Если делаешь контент с визуальным рядом — сначала изучи методологию: как правильно делать такие видео, какие приёмы работают, какие нет. web_search по "faceless video methodology", "ken burns effect tutorial", "video hook strategies", "best background for text shorts". Не тупи — сперва исследуй, потом делай. Пользователь явно просил: "Изучи методологию как правильно делать такие видео", "Правь методологию изучай интернет".271- **HF Spaces Gradio 5** — POST `/gradio_api/call/{fn}` работает (event_id), но WebSocket `/gradio_api/queue/join` возвращает **403** из РФ. Результат без WS не получить. Решение: браузерная автоматизация (Scrapling/Playwright) через SOCKS5 прокси. Детали: `references/free-video-sources.md` (раздел "Hugging Face Spaces / Решение: браузерная автоматизация")272273## Monetization Touchpoints274275- **YouTube**: Ad revenue, affiliate links in description, sponsorships276- **Telegram**: Paid channel, affiliate, digital products277- **Blog**: AdSense, affiliate, sponsored posts278- **Instagram**: Brand deals, affiliate, product sales279- **X/Twitter**: Monetization program, affiliate, consulting leads