Open-Source Cold Email & Warmup Platform
Warmbly 是开源的冷邮件平台:温暖您的邮箱、发送活动、并对每条回复进行分流。可在我们的云端运行,也可自行托管整套系统。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗A 4-agent pipeline that writes, edits, uploads, and reports on daily faceless history YouTube Shorts — entirely on free tiers. Plus a node-graph dashboard that shows each agent as idle / running / done / error in real time.
script_agent -> video_agent -> upload_agent -> discord_agent
!latest and
!stats.python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
cp config/.env.example config/.env
You'll also need ffmpeg and imagemagick installed locally
(macOS: brew install ffmpeg imagemagick, Ubuntu: sudo apt install ffmpeg imagemagick).
config/.env as PEXELS_API_KEY.config/.env as FREESOUND_API_KEY.config/client_secret.json.config/.env as YOUTUBE_CHANNEL_ID.python agents/upload_agent.py once locally — it'll open a
browser for one-time consent and save config/token.json. After
this, uploads are fully automatic (the token auto-refreshes).config/.env as
YOUTUBE_API_KEY — this powers the analytics dashboard (subscriber/
view counts). No OAuth consent needed, it's read-only public data.config/.env as DISCORD_BOT_TOKEN.bot, permission Send Messages, open the generated URL to invite it to your server.config/.env as DISCORD_WEBHOOK_URL.# one full pipeline run: script -> video -> upload -> discord ping
python orchestrator.py
Watch it live:
# in a second terminal
python serve_dashboard.py
# open http://localhost:5050
For the interactive !latest / !stats Discord bot (separate from
the pipeline, keep it running continuously):
python agents/discord_agent.py bot
This is the "set it and forget it" free-hosting option — 6 scheduled shorts/day, right at YouTube's 6-upload/day quota, at zero dollar cost. A separate weekly long-form pipeline (~10 minute military-history videos) also runs on Actions every Sunday — see section 6. Sunday's 6th Short is skipped to make room for it under the 6-upload/day quota.
.gitignore is respected —
never commit .env, client_secret.json, or token.json directly).PEXELS_API_KEYFREESOUND_API_KEYYOUTUBE_CHANNEL_IDYOUTUBE_API_KEYDISCORD_WEBHOOK_URLYOUTUBE_CLIENT_SECRET_JSON — paste the full contents of your
local config/client_secret.jsonYOUTUBE_TOKEN_JSON — paste the full contents of your local
config/token.json (generated in step 1.4.7 above).github/workflows/pipeline.yml runs automatically
6x/day. Adjust the six cron lines to your preferred posting times
(they're in UTC)..github/workflows/analytics.yml runs separately every 4 hours to
snapshot channel/video stats for the dashboard — same
YOUTUBE_API_KEY and YOUTUBE_CHANNEL_ID secrets, no extra setup.Note: the interactive Discord bot (!stats, !latest) needs a
long-lived connection, so it can't run on GitHub Actions' scheduled
jobs. Run it on your own machine, or a small always-on free host like
Railway's or Fly.io's free tier.
agents/script_agent.py to change
pacing/hook style._build_scene_clip() in agents/video_agent.py.voice = "en-US-GuyNeural" in video_agent.py for any other
free edge-tts voice — run edge-tts --list-voices to see all options.tiny.en model runs on CPU in GitHub Actions' free runner
(2 cores/7GB RAM) without issue for ~60s clips.A second, separate pipeline: one ~10 minute video a week on a famous general or tactician — three of their battles, and the specific tactic that won each one (the situation, the tactic, how the battle unfolded, the result, and the lesson).
It runs on GitHub Actions every Sunday at 13:00 UTC
(.github/workflows/longform.yml), using the same repo secrets as the
shorts. Sunday's 6th Short is skipped so that day stays at 6 uploads
(YouTube's daily limit). You can also trigger it from the Actions
tab -> "Run Weekly Long-Form Video" -> Run workflow.
How it works:
agents/longform_script_agent.py) — the general and their
three battles come from the curated GENERALS list, not the model, so
no battle is ever invented. Each battle chapter is grounded in that
battle's Wikipedia article, and written by qwen2.5:7b via Ollama (the
shorts' 3B llama3.2 got too many facts wrong). Generals already
covered are tracked in data/longform_used_topics.json so none repeats
until the whole list has been done.agents/longform_video_agent.py) — 1920x1080, narrated
over ~35 AI illustrations in the same crude cartoon style as the
thumbnail, no music. The narration is split into beats (a few
sentences, ~15-20s each); Ollama describes one simple scene per beat,
using only the placeholders THE GENERAL / OUR MEN / ENEMY MEN, which
are swapped for the hand-written costumes in GENERALS (so the
general and both sides look the same in every picture). Every scene is
checked — no names, no gore, no out-of-era objects — and re-asked or
replaced with a safe fallback if it fails. Each picture slowly zooms
while its beat is read (edge-tts, deep documentary voice), and each
chapter opens with a title card in the thumbnail font. ~35 images use
~5,500 of Cloudflare's 10,000 free daily neurons.agents/thumbnail_agent.py) — a crude, childish
cartoon (round bald heads, dot eyes, nub noses, soft flat colors): the
general drawn big in an accurate costume, a small background hint at
their most famous battle, and a 2-4 word hook in a chunky cartoon font
(assets/fonts/, Luckiest Guy, Apache 2.0). Costume, background and
hook are written by hand per general in GENERALS; Cloudflare Workers
AI (Flux 2 Klein 4B, free daily allowance) draws two candidates and
the one with the emptiest text area wins. It's set on the video after
upload and attached to the Discord post. Skipped (YouTube auto-picks a
frame) if the Cloudflare secrets aren't set or anything fails. Shorts
don't get one — API-set thumbnails don't reliably show in the Shorts feed.Thumbnail setup (one time):
CLOUDFLARE_ACCOUNT_ID and
CLOUDFLARE_API_TOKEN (and in config/.env for local tests).python agents/thumbnail_agent.py "Julius Caesar"
writes data/output/thumbnail_preview.jpg.Test it locally (renders to data/output/, never uploads):
ollama pull qwen2.5:7b
python longform_orchestrator.py 2 # optional: target length in minutes
GENERALS in agents/longform_script_agent.py is the topic pool —
add a general with their era, three (battle, tactic) pairs, a look
(costume), a thumb (featured battle, background visual, ground,
hook), an army and one enemies entry per battle (the names the
narration uses for each side, and how each side is drawn). Never put a
real person's name in look/visual: the image API's safety filter
refuses prompts that name real people.TARGET_MINUTES in the same file sets the video length (the model
tends to run ~10% long).STYLE, SCENE, POSES and the TEXT_* settings in
agents/thumbnail_agent.py control the thumbnail's art style,
composition and hook-text look.TARGET_IMAGES, ZOOM_AMOUNT and ERA_OBJECTS in
agents/longform_video_agent.py set the number of illustrations, how
far each one zooms, and what each era's pictures may contain;
LONGFORM_VOICE_NAME overrides the narrator voice.