Automation & Scheduling
Once configured, Wintermute runs fully automatically via cron jobs on Render.
What It Does
The automation system handles two recurring tasks: running the full content pipeline daily to produce new videos, and checking for approved content that is due to be posted. Both run on fixed schedules without any manual intervention.
How It Works
Daily Pipeline (6am UTC)
Schedule: 0 6 * * * (every day at 6:00 AM UTC)
What it runs: The full pipeline sequentially for all active channels:
- Fetch Topics — Pull new topics from all active sources
- Generate Scripts — Write hooks and scripts for up to 20 draft items
- Generate Voice — Create TTS audio for up to 20 scripted items
- Assemble Video — Compose video for up to 1 voiced item (memory-limited on 512MB Render instances)
Video assembly is limited to 1 per cron run to stay within memory constraints. If you have more voiced items queued, they will be assembled on subsequent runs.
Hourly Posting
Schedule: 0 * * * * (every hour, on the hour)
What it runs: Checks for approved content where scheduled_for has passed, and posts it to YouTube.
This means you can approve content in the Review Queue and set a future posting time, and the system will post it automatically at the right moment.
Manual Triggers
You can also trigger any pipeline stage manually from the dashboard:
- Pipeline page — Buttons for each individual stage (Fetch Topics, Generate Scripts, Generate Voice, Assemble Video)
- Trends Overview — Worker action buttons (Ingest, Analyze, Snapshot)
- Tracked Channels — “Next Steps” section with worker buttons
- Video Explorer — Worker buttons in the empty state
Manual triggers are useful for testing, catching up on a backlog, or running a stage outside the normal schedule.
Render Configuration
The cron jobs are defined in render.yaml:
services:
- type: web
name: autoshorts-worker
runtime: docker
dockerfilePath: worker/Dockerfile
plan: starter
crons:
- name: daily-pipeline
schedule: "0 6 * * *"
command: "curl -X POST http://localhost:8000/pipeline/run-full -H 'Authorization: Bearer $WORKER_API_KEY'"
- name: hourly-posting
schedule: "0 * * * *"
command: "curl -X POST http://localhost:8000/pipeline/post-scheduled -H 'Authorization: Bearer $WORKER_API_KEY'"How Render Cron Works
Render cron jobs run inside the same container as the web service. The curl command hits the Worker’s own HTTP endpoint internally. The WORKER_API_KEY environment variable authenticates the request just like any external call would.
Where to Find It
- Dashboard: Pipeline page shows run history and trigger buttons
- Render Dashboard: Cron job logs, scheduling, and execution history
- Config file:
render.yamlin the repository root
Dependencies
- Render web service (Starter plan or higher) — Hosts the Worker and cron jobs
WORKER_API_KEY— Required for authenticating cron job requests to the pipeline endpoints- All pipeline-stage dependencies apply (OpenAI, FFmpeg, etc.) since the cron runs the full pipeline