Skip to Content
System ReferenceAutomation & Scheduling

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:

  1. Fetch Topics — Pull new topics from all active sources
  2. Generate Scripts — Write hooks and scripts for up to 20 draft items
  3. Generate Voice — Create TTS audio for up to 20 scripted items
  4. 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.yaml in 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
Last updated on