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.