n8n Automation Developer — Automated Video Rendering Pipeline (FFmpeg)

Please login or register as jobseeker to apply for this job.

TYPE OF WORK

Gig

SALARY

$5/hour

HOURS PER WEEK

TBD

DATE UPDATED

Aug 14, 2026

JOB OVERVIEW

We produce long-form videos at volume. Right now the assembly is manual and it's the bottleneck.

We want an n8n workflow that renders finished videos end-to-end, unattended. You give it a topic or a row in a sheet, it comes back with a finished MP4.

The pipeline needs to:

1. Take a job in — from a Google Sheet row

2. Source footage — from two places:
- a local stock footage library (Drive folder)
- free stock APIs as fallback when the local library has no match (Pexels and Pixabay, both free for commercial use)

3. Select and sequence clips to match the script or keyword list, trim them to the right durations.

4. Composite an overlay clip on top — this is the important part. We have a branded overlay video that plays over the whole render. It has regions that are green screen/transparent, and the stock footage shows through those windows. The overlay changes at points during the video, so the pipeline has to handle multiple overlay segments in one render, not just one static layer.

5. Encode and output the final MP4 to Google Drive

6. Log and recover — every run logged, failures retried, no silent failures, no half-rendered files left behind.

Reference example of the output we want: ----------

Must have
- Self-hosted n8n — you've installed it yourself on a VPS or Docker, not just used the cloud UI
- FFmpeg from the command line — real fluency, specifically overlay, chromakey/colorkey, scale, concat, filter_complex. If you have only ever used a drag-and-drop editor, this role is not for you
- Execute Command / Code nodes in n8n — comfortable shelling out and handling stdout, exit codes, and file paths
- REST API integration — auth headers, pagination, rate limits, retries, caching
- Linux + SSH, file system handling, cron/queue basics
- Written English good enough to document what you built so someone else can maintain it

Nice to have
Chroma keying experience — knowing why despill and edge feathering matter
Alpha-channel video formats (ProRes 4444, VP9/WebM with alpha)
Hardware-accelerated encoding (NVENC / VAAPI / QSV)
Queue systems for long-running jobs (Redis, BullMQ, or n8n queue mode)
Prior work building unattended render pipelines at volume

Deliverables
Working n8n workflow, exported as JSON
All FFmpeg commands and helper scripts, commented
Setup documentation — how to install it fresh on a new machine
A short Loom walkthrough of how it works and how to change it
Handover

SKILL REQUIREMENT
VIEW OTHER JOB POSTS FROM:
SHARE THIS POST
facebook linkedin
  BENCHMARKS  
Loading Time: Base Classes  0.0008
Controller Execution Time ( Jobseekers / Job )  0.0159
Total Execution Time  0.0172
  GET DATA  
No GET data exists
  MEMORY USAGE  
1,499,264 bytes
  POST DATA  
No POST data exists
  URI STRING  
jobseekers/job/n8n-Automation-Developer-Automated-Video-Rendering-Pipeline-FFmpeg-1709189
  CLASS/METHOD  
jobseekers/job
  DATABASE:  onlinejobs (Jobseekers:$db)   QUERIES: 13 (0.0103 seconds)  (Hide)
0.0003   SELECT *
                                
FROM exrates
                                WHERE rate_name 
'USD-PHP' 
0.0004   SELECT *
FROM `employer_jobs`
WHERE `job_id` = 1709189
 LIMIT 1 
0.0013   SELECT *
FROM `employers`
WHERE `employer_id` = 929619
 LIMIT 1 
0.0012   SELECT COUNT(*) AS `numrows`
FROM `t_thread` `t`
LEFT JOIN `t_thread_misc` `miscON `t`.`id` = `misc`.`thread_id`
WHERE `t`.`job_id` = 1709189
AND `misc`.`idIS NULL 
0.0005   SELECT e.business_namee.logoe.websitee.rebill_datee.date_added member_datehitsDATEDIFF('2026-08-16',ej.date_added) duration_daysDATEDIFF('2026-08-16',e.rebill_date) duration_rebillej.*, e.deactivate FROM employers eemployer_jobs ej WHERE e.employer_id ej.employer_id AND
                                   ((
e.user_level >= '500' AND ej.date_added <= e.rebill_date)
                                   OR 
e.employer_id '' OR (ej.date_approved <> '2000-01-01' and DATEDIFF('2026-08-16',ej.date_added) <= 14 ))
                                   AND 
e.deactivate != AND ej.deleted AND job_id '1709189' 
0.0003   SELECT *
FROM `employer_jobs_skills` `ejs`
LEFT JOIN `skills_categories` `scON `ejs`.`skill_id` = `sc`.`id`
WHERE `job_id` = 1709189 
0.0007   UPDATE employer_jobs SET hit_counts '***Aug-14-2026=731***Aug-15-2026=100***Aug-16-2026=1' WHERE job_id'1709189'  
0.0006   UPDATE employer_jobs SET monthly_hits '***Aug-2026=832' WHERE job_id'1709189'  
0.0008   SELECT date_sent FROM jobseeker_sent_emails WHERE jobseeker_id '' AND job_id '1709189' AND status LIKE 'sent%' ORDER BY id DESC  
0.0003   SELECT *
FROM `employer_jobs_skills` `ejs`
LEFT JOIN `skills_categories` `scON `ejs`.`skill_id` = `sc`.`id`
WHERE `job_id` = 1709189 
0.0034   SELECT COUNT(*) AS `numrows`
FROM `employer_jobs`
WHERE `employer_id` = '929619'
AND `date_added` >= '2022-06-08' 
0.0003   select from teasers 
0.0002   SELECT FROM skill_categories WHERE skill_cat_id='' 
  HTTP HEADERS  (Show)
  SESSION DATA  (Show)
  CONFIG VARIABLES  (Show)