Open-Source Cold Email & Warmup Platform
Warmbly는 메일함을 예열하고 캠페인 전송·답변 triage를 지원하는 오픈소스 콜드 이메일 플랫폼입니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 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.