How to set up: youtube shorts pipeline
- Step 1Fork the blueprint — Open this workflow and click Fork. JAD copies the two-node chain (video-transcoder → cloudflare-r2) into a new private draft owned by you, snapshots it as version 1, and wires the transcoder's `out` port to the R2 node's `in` port automatically.
- Step 2Pair a runner — The R2 node is a connector — it only executes on a paired `@jadapps/runner`. Start your runner and confirm it shows green in the orchestrator status pill. Without a runner the upload step throws a clear 'requires a paired runner' error.
- Step 3Add R2 credentials on the runner — Store a credential under the ref `r2-prod` holding accessKeyId, secretAccessKey, and accountId. The runner keeps these locally; JAD's server never sees the keys and derives the R2 endpoint from the accountId.
- Step 4Configure the transcode output — Open the [video-transcoder](/video-tools/video-transcoder) node and pick your output container/codec (default H.264 + AAC MP4). Transcode runs in your browser, so a Pro + Media plan is required for hardware-accelerated WebCodecs and large files.
- Step 5Set the destination bucket and key — In the R2 node set `action` to putObject, fill in `bucket`, set `key` (default `videos/output.mp4`), and `contentType` to `video/mp4`. Use a per-file key template if you batch, or the default key will overwrite each run.
- Step 6Run on one file, then schedule or batch — Drop a single video to test the full chain end to end. To process many, wrap the chain in a For-Each over a folder; to automate, add a cron schedule (the workflow ships unscheduled — `scheduleCron` is null) or trigger via webhook.
Frequently asked questions
Does the transcode really run on a server runner?+
No — and this corrects a common misconception. The transcode step (video-transcoder) runs in your browser via FFmpeg WASM / WebCodecs through the orchestrator's video handler. Your source never leaves your machine to be re-encoded. Only the second node, the Cloudflare R2 upload, runs on a paired runner because it's a connector that needs your stored credentials and network egress.
Why does the workflow need a runner at all, then?+
Because cloudflare-r2 is a connector. Connectors execute exclusively on a paired `@jadapps/runner` so your R2 keys stay on your own machine and the SigV4-signed request goes out from there. If no runner is paired the upload node throws a clear 'requires a paired runner' error.
Where are my R2 access keys stored?+
On the runner, under the credentialRef `r2-prod`, holding accessKeyId, secretAccessKey, and accountId. They are never written into the workflow graph and JAD's server never sees them — the R2 endpoint is derived from the accountId on the runner side.
Is this workflow cron-scheduled out of the box?+
No. The blueprint ships with `scheduleCron: null`, so it's a manual or webhook-triggered chain. Cron is a real, separate capability: add a 5-field POSIX expression and the cron tick (wired via Cloudflare Cron Triggers) enqueues a run whenever it's due.
What tier do I need?+
Pro + Media. Tier precheck takes the strictest minTier across the graph; video-transcoder is pro_media (hardware encode + streaming) and cloudflare-r2 is pro, so pro_media wins. Free and Pro users are blocked with a single upgrade prompt before the run starts.
How big can the source video be?+
It depends on the transcode tier. Pro RAM-loads up to 500 MB. Pro + Media streams chunks via JAD-Stream with no size cap, which is why this workflow is gated to Pro + Media. Free's 10 MB ceiling is moot here because the workflow can't run on Free.
What output format does it produce?+
By default the transcoder produces H.264 + AAC in an MP4 container — the most broadly compatible web video. You can change container/codec in the video-transcoder node (it supports H.264, H.265, ProRes, VP9, AV1), but keep the R2 node's contentType in sync.
How do I avoid overwriting previous uploads?+
The blueprint's default key is the constant `videos/output.mp4`, so each run overwrites the last. Set a unique key per run — a date/name template like `videos/2026/launch.mp4`, or `${item.name}` inside a For-Each batch.
Can I batch a whole folder?+
Yes. Wrap the two-node chain inside a logic.for-each over the dropped folder. The for-each runs the body once per item with bounded concurrency (1-32) and emits a JSON array of results on its done port. Use a per-item key so uploads don't collide.
What happens if the R2 upload fails intermittently?+
Set the R2 node's errorPolicy to `retry`. The runner re-attempts the step up to 3 times with linear backoff (200ms, then 400ms) before the error propagates. Without retry, the default policy aborts the run; `skip` would drop just that branch.
Is there a record of forks and runs?+
Yes. Forking writes a server-side `forked` audit event (tagged with the blueprint slug) to the workflow_audit_events table, and runs write run_triggered / run_cancelled events. It's fire-and-forget so it never blocks your action, and it's an org/compliance trail rather than a local trace log.
What related tools and workflows pair well with this?+
Swap the transcoder for [video-merger](/video-tools/video-merger) to stitch clips before upload, or [lossless-trimmer](/video-tools/lossless-trimmer) to cut without re-encoding. For other automation patterns see the [RSS to Notion digest](/workflows/rss-to-notion-digest) and [PDF batch extract to Sheets](/workflows/pdf-batch-extract-to-sheets) workflows.