diff --git a/automation/activepieces.mdx b/automation/activepieces.mdx
index 2d230ba..2d6b904 100644
--- a/automation/activepieces.mdx
+++ b/automation/activepieces.mdx
@@ -2,7 +2,7 @@
title: "Run media jobs from Activepieces"
sidebarTitle: "Activepieces"
description: "Install the Rendobar piece on Activepieces, add an API key, and run media jobs that pause the flow until they finish, with a trigger for finished jobs."
-icon: "puzzle-piece"
+icon: "/images/logos/activepieces.svg"
keywords: ["activepieces", "activepieces piece", "rendobar activepieces", "@rendobar/piece-rendobar", "activepieces video processing", "activepieces ffmpeg", "activepieces waitpoint", "activepieces custom piece"]
canonical: "https://rendobar.com/docs/automation/activepieces"
---
@@ -31,13 +31,13 @@ The Rendobar piece runs FFmpeg commands, compression, captions and image generat
@rendobar/piece-rendobar
```
-
-
+
+
## Before you start
-- A Rendobar API key. Create one in the [dashboard](https://app.rendobar.com) under **Settings > API keys**.
+- A Rendobar API key. Create one on the [API Keys](https://app.rendobar.com/api-keys) page of the dashboard.
- Platform admin access to Activepieces 0.36.1 or later. The piece installs from npm rather than from the Activepieces catalog, and installing a custom piece is a paid feature on Activepieces Cloud.
- An Activepieces that Rendobar can reach over HTTPS, for flows that pause and for the instant trigger. Without one, **Run a Media Job** polls instead and **Finished Job (Polling)** replaces the trigger.
diff --git a/automation/http.mdx b/automation/http.mdx
deleted file mode 100644
index aadbc02..0000000
--- a/automation/http.mdx
+++ /dev/null
@@ -1,165 +0,0 @@
----
-title: "Run jobs from any automation tool over HTTP"
-sidebarTitle: "Any tool over HTTP"
-description: "Submit jobs from Make, Zapier or any tool with an HTTP step, receive the result on a webhook, and re-read the job before you use its file."
-icon: "globe"
-keywords: ["make video api", "zapier video processing", "make http module ffmpeg", "zapier ffmpeg", "webhooks by zapier video", "automation http request video", "callback url automation", "no-code ffmpeg api"]
-canonical: "https://rendobar.com/docs/automation/http"
----
-
-
-
-Any automation tool that can send an HTTP request and receive a webhook can run Rendobar jobs. One workflow submits the job with a callback URL, and a second workflow starts when Rendobar calls that URL as the job ends.
-
-Use this for Make, Zapier, and self-hosted n8n with community nodes turned off. With the [n8n node](/automation/n8n) or the [Activepieces piece](/automation/activepieces), one workflow waits for the job itself, so use those guides instead.
-
-
-
-
-
-## Submit a job
-
-Send `POST https://api.rendobar.com/jobs` with your API key and a JSON body:
-
-```bash
-curl -X POST https://api.rendobar.com/jobs \
- -H "Authorization: Bearer rb_YOUR_KEY" \
- -H "Content-Type: application/json" \
- -d '{
- "type": "ffmpeg",
- "params": {
- "command": "ffmpeg -i https://cdn.rendobar.com/assets/examples/sample.mp4 -vf scale=-2:720 -c:v libx264 -crf 28 output.mp4"
- },
- "callback": { "url": "https://hooks.example.com/rendobar-finished" },
- "idempotencyKey": "row-42"
- }'
-```
-
-The response names the job:
-
-```json
-{ "data": { "id": "job_a1b2c3d4", "status": "waiting" } }
-```
-
-- **`callback.url`** is the webhook URL of your second workflow. It must be public HTTPS.
-- **`idempotencyKey`** makes a repeated submission return the first job instead of billing a second one. Use a value unique to the record, such as a row id, so a retried step is safe.
-
-Store the job `id` with your record if the second workflow needs to find the record again.
-
-## Receive the result
-
-When the job completes, fails or is cancelled, Rendobar POSTs the job to `callback.url`. These terminal events always fire, so the second workflow always runs. A completed job, shortened to the fields most workflows map:
-
-```json
-{
- "version": "1",
- "event": "job.completed",
- "deliveryId": "whd_x1y2z3",
- "timestamp": 1707436815000,
- "orgId": "org_abc123",
- "data": {
- "jobId": "job_a1b2c3d4",
- "jobType": "ffmpeg",
- "status": "complete",
- "output": {
- "data": null,
- "file": {
- "url": "https://r2.rendobar.com/...",
- "path": "output.mp4",
- "type": "video",
- "size": 15234567
- },
- "expiresAt": 1707440415000
- }
- }
-}
-```
-
-Branch on `event`. A `job.failed` delivery carries `data.error.message` in place of `output`. A job with storage destinations also sends `job.deliveries_settled` once every bucket has resolved.
-
-## Re-read the job before you use it
-
-Anyone who learns the callback URL can post to it. Before the second workflow uses the file, fetch the job with your own key:
-
-```bash
-curl https://api.rendobar.com/jobs/job_a1b2c3d4 \
- -H "Authorization: Bearer rb_YOUR_KEY"
-```
-
-Check that `data.status` is `complete`, then take `data.output.file.url` from this response. The URL expires, so copy the file to its destination in the same workflow.
-
-A tool with a code step can verify the signature instead. Set `callback.verify` to `true` and check `X-Rendobar-Signature` as the [callbacks guide](/guides/callbacks#secure-it) shows.
-
-## Set it up in your tool
-
-Build the receiving workflow first, so its webhook URL exists when you write the request body.
-
-
-
- 1. Create a scenario that starts with **Webhooks > Custom webhook**. Add a webhook and copy its URL.
- 2. In the scenario that submits jobs, add **HTTP > Make a request**. Set **URL** to `https://api.rendobar.com/jobs` and **Method** to `POST`.
- 3. Under **Headers**, add `Authorization` with the value `Bearer rb_YOUR_KEY`.
- 4. Set **Body content type** to `application/json`, choose **JSON string** as the body input method, and paste the request body with the webhook URL as `callback.url`. Turn on **Parse response** to map `data.id`.
- 5. Submit one job so the webhook learns the payload's fields.
- 6. In the receiving scenario, add another **Make a request** that sends `GET` to `https://api.rendobar.com/jobs/` followed by the mapped `data.jobId`, with the same header.
-
-
- Webhooks by Zapier is available on the Professional, Team and Enterprise plans.
-
- 1. Create a Zap that starts with **Webhooks by Zapier** and the **Catch Hook** event. Copy the webhook URL it gives you.
- 2. In the Zap that submits jobs, add **Webhooks by Zapier** with the **Custom Request** event. Set **Method** to `POST` and **URL** to `https://api.rendobar.com/jobs`.
- 3. Paste the request body into **Data**, with the Catch Hook URL as `callback.url`.
- 4. Under **Headers**, add `Authorization` with `Bearer rb_YOUR_KEY`, and `Content-Type` with `application/json`.
- 5. Submit one job, then test the Catch Hook trigger so Zapier learns the payload's fields.
- 6. In the catching Zap, add another **Custom Request** that sends `GET` to `https://api.rendobar.com/jobs/` followed by the caught `data.jobId`, with the same `Authorization` header.
-
-
- Any tool with an HTTP request step and a webhook trigger follows the same shape:
-
- 1. A second workflow that starts on a webhook trigger. Its URL goes in `callback.url`.
- 2. A `POST` to `https://api.rendobar.com/jobs` with the `Authorization` and `Content-Type` headers and the JSON body above.
- 3. In the second workflow, a `GET` to `https://api.rendobar.com/jobs/{jobId}` with the same `Authorization` header before the file is used.
-
-
-
-## Troubleshooting
-
-
-
- The `Authorization` header is missing or the key is wrong. The value is `Bearer`, a space, then the key, which starts with `rb_`.
-
-
- The account balance is below the job's estimated cost. Top up at [app.rendobar.com/billing](https://app.rendobar.com/billing).
-
-
- Rendobar could not deliver to `callback.url`. It must be a public HTTPS address, and the receiving workflow must be turned on. Fetch the job and read `data.callback.status`: `delivered` means your tool accepted the POST, and `failed` means every retry was refused.
-
-
- Delivery is at least once, so a retried delivery can repeat an event. Skip any `deliveryId` you have already handled, and filter on `event` so `job.deliveries_settled` does not run the completed branch again.
-
-
-
-## See also
-
-- [Callbacks](/guides/callbacks): the payload, the headers and the signature
-- [Webhooks](/guides/webhooks): events for every job in the organization at one endpoint
-- [FFmpeg job](/jobs/ffmpeg): how a command names its inputs and outputs
-- [Errors](/support/errors): every error code the API returns
-
-Next step: build the receiving workflow, then submit one job with its webhook URL as `callback.url`.
diff --git a/automation/index.mdx b/automation/index.mdx
index 65d3180..b048802 100644
--- a/automation/index.mdx
+++ b/automation/index.mdx
@@ -1,9 +1,9 @@
---
title: "Automate media jobs without code"
-description: "Run Rendobar video and image jobs from n8n or Activepieces, start from ready-made templates, and wait for long jobs without polling."
+description: "Run Rendobar video and image jobs from n8n or Activepieces, and start from ready-made workflows that import and run on n8n Cloud."
sidebarTitle: "Overview"
-icon: "diagram-project"
-keywords: ["rendobar automation", "no-code video processing", "n8n video automation", "activepieces video processing", "make video api", "zapier video api", "workflow automation ffmpeg", "video automation templates"]
+icon: "grid-2"
+keywords: ["rendobar automation", "no-code video processing", "n8n video automation", "activepieces video processing", "make video api", "zapier video api", "n8n templates", "video automation templates"]
canonical: "https://rendobar.com/docs/automation"
---
@@ -15,7 +15,7 @@ canonical: "https://rendobar.com/docs/automation"
"@type": "TechArticle",
"@id": "https://rendobar.com/docs/automation/#article",
"headline": "Automate media jobs without code",
- "description": "Run Rendobar video and image jobs from n8n or Activepieces, start from ready-made templates, and wait for long jobs without polling.",
+ "description": "Run Rendobar video and image jobs from n8n or Activepieces, and start from ready-made workflows that import and run on n8n Cloud.",
"datePublished": "2026-09-15",
"dateModified": "2026-09-15",
"author": { "@type": "Organization", "@id": "https://rendobar.com/#organization" },
@@ -25,60 +25,38 @@ canonical: "https://rendobar.com/docs/automation"
}}
/>
-Run Rendobar jobs from an automation platform instead of code. A workflow submits the job, waits without holding a worker, and hands the finished file to the next step, such as Google Drive, Slack or YouTube.
+Run Rendobar jobs from an automation platform instead of code.
-
-
+
+
## Platforms
- A verified node for n8n Cloud and self-hosted n8n, with a trigger and AI Agent tool support.
+ Verified node for n8n Cloud and self-hosted n8n.
- A piece for self-hosted and paid Activepieces. Flows pause until the job finishes.
+ Piece for self-hosted and paid Activepieces.
-
- Make, Zapier, or any tool that can send a request and receive a webhook.
+
+ Coming soon.
-
- Import a finished n8n workflow, connect your accounts and run it.
+
+ Coming soon.
-## Start from a template
+## Templates
+
+Finished n8n workflows that run on n8n Cloud. Open a card, copy its address, and paste it into **Import from URL** in the n8n workflow menu. Each workflow lists its setup steps in a sticky note.
-
- A new sheet row becomes a 9:16 quote video with music, set in a font made for its language.
+
+ A new sheet row becomes a 9:16 quote video with music, in a font made for its language.
-
+
A form takes a video URL and a command. Failed jobs post the FFmpeg error to Slack.
-
-## How waiting works
-
-Media jobs run for seconds or for hours, which is longer than most platforms let one step run. Every integration here waits the same way. The job carries a callback URL, the workflow stops, and Rendobar calls that URL when the job ends. Nothing polls in between.
-
-| | n8n | Activepieces | Any tool over HTTP |
-|---|---|---|---|
-| Install | From the nodes panel | **Install Piece** in the platform admin | Nothing to install |
-| Runs on | n8n Cloud and self-hosted n8n | Self-hosted, or a paid Activepieces Cloud plan | Any tool with an HTTP step |
-| Waits with | A Wait node the callback resumes | A waitpoint the callback resumes | A second workflow the callback starts |
-| Starts a workflow when a job ends | Rendobar Trigger | Finished Job trigger | A webhook trigger |
-
-The callback tells the workflow a job ended. Each guide then re-reads the job with your own API key before using the file. [Callbacks](/guides/callbacks) covers the payload and its signature.
-
-## Before you start
-
-Every integration authenticates with a Rendobar API key. Create one in the [dashboard](https://app.rendobar.com) under **Settings > API keys**. A key created before September 13, 2026 cannot read [storage connections](/storage), so make a new one if a workflow reads from your bucket or delivers to it.
-
-## See also
-
-- [Callbacks](/guides/callbacks): the per-job URL every platform waits on
-- [Webhooks](/guides/webhooks): events for every job in the organization
-- [Jobs](/concepts/job): the statuses a job moves through and the output shape
-- [Storage connections](/storage): read inputs from your bucket and deliver outputs to it
diff --git a/automation/make.mdx b/automation/make.mdx
new file mode 100644
index 0000000..450016a
--- /dev/null
+++ b/automation/make.mdx
@@ -0,0 +1,11 @@
+---
+title: "Run media jobs from Make"
+sidebarTitle: "Make"
+description: "Use Rendobar from Make scenarios to run video and image jobs. The Make app is in progress, and this page covers it once it ships."
+icon: "/images/logos/make.svg"
+tag: "Soon"
+noindex: true
+canonical: "https://rendobar.com/docs/automation/make"
+---
+
+The Rendobar app for Make is in progress. Until it ships, run Rendobar jobs from the [n8n node](/automation/n8n) or the [Activepieces piece](/automation/activepieces).
diff --git a/automation/n8n.mdx b/automation/n8n.mdx
index e9dabdd..0fa00ac 100644
--- a/automation/n8n.mdx
+++ b/automation/n8n.mdx
@@ -2,7 +2,7 @@
title: "Run media jobs from n8n"
sidebarTitle: "n8n"
description: "Install the verified Rendobar node on n8n Cloud or self-hosted n8n, add an API key, then run media jobs, wait without polling and hand the node to an AI Agent."
-icon: "circle-nodes"
+icon: "/images/logos/n8n.svg"
keywords: ["n8n", "n8n node", "rendobar n8n", "n8n cloud ffmpeg", "n8n video processing", "n8n compress video", "n8n captions", "verified community node", "n8n ai agent video", "@rendobar/n8n-nodes-rendobar"]
canonical: "https://rendobar.com/docs/automation/n8n"
---
@@ -31,13 +31,13 @@ The Rendobar node runs FFmpeg commands, compression, captions, composition and i
@rendobar/n8n-nodes-rendobar
```
-
-
+
+
## Before you start
-- A Rendobar API key. Create one in the [dashboard](https://app.rendobar.com) under **Settings > API keys**.
+- A Rendobar API key. Create one on the [API Keys](https://app.rendobar.com/api-keys) page of the dashboard.
- n8n Cloud, or self-hosted n8n 1.94.0 or later.
- On self-hosted n8n, a public HTTPS address, so the trigger node and the Wait node can receive Rendobar's calls. See [Start a workflow when a job ends](#start-a-workflow-when-a-job-ends).
@@ -55,8 +55,8 @@ The Rendobar node runs FFmpeg commands, compression, captions, composition and i
-
-
+
+
If nothing appears under **More from the community**, an instance owner turns on **Verified Community Nodes** in the Cloud Admin Panel. A restart of the instance may be needed the first time.
@@ -74,7 +74,7 @@ The older route also works. Open **Settings > Community Nodes**, choose **Instal
## Add your API key
-The node authenticates with a Rendobar API key. Create one in the [dashboard](https://app.rendobar.com) under API keys, then add a **Rendobar API** credential in n8n and paste it in. The key starts with `rb_`. n8n checks it against your account when you save, so a wrong key fails at save time and not mid-workflow.
+The node authenticates with a Rendobar API key. Create one on the [API Keys](https://app.rendobar.com/api-keys) page of the dashboard, then add a **Rendobar API** credential in n8n and paste it in. The key starts with `rb_`. n8n checks it against your account when you save, so a wrong key fails at save time and not mid-workflow.
Leave **Base URL** at `https://api.rendobar.com` unless you're pointing at another environment.
@@ -211,18 +211,13 @@ Give an agent **Callback URL** and a Wait node rather than **Wait for Completion
Create Job's **Destinations** option writes the output to buckets connected on the [Storage page](https://app.rendobar.com/storage): one row per bucket, each with an optional folder or path. The job's `deliveries` reports every write. **Storage Connection** lists the connections, and **Storage File** lists the folders and files in one, each with a `storage://` URI that a job input accepts. See [Storage connections](/storage).
-## Templates
+
+ Destinations, the Storage resources and the three delivery events need version 0.6.0 or later. An install from the nodes panel gets the version n8n has verified, which can trail the latest npm release.
+
-Two workflows import as they are and run on n8n Cloud, each with its setup steps in a sticky note. [Templates](/automation/templates) lists what each one needs.
+## Templates
-
-
- A new sheet row becomes a 9:16 quote video with music, set in a font made for its language.
-
-
- A form takes a video URL and a command. Failed jobs post the FFmpeg error to Slack.
-
-
+Ready-made workflows that import and run on n8n Cloud are listed on the [Automation overview](/automation#templates).
## Troubleshooting
@@ -251,4 +246,4 @@ Two workflows import as they are and run on n8n Cloud, each with its setup steps
- [Rendobar on n8n.io](https://n8n.io/integrations/rendobar/): the verified listing
- [Source on GitHub](https://github.com/rendobar/n8n-nodes-rendobar): MIT licensed, published from CI with npm provenance
-Next step: import the [FFmpeg workflow](/automation/templates#run-ffmpeg-commands-on-n8n-cloud-with-google-drive-and-slack) and run a command from its form.
+Next step: import a [template](/automation#templates) and run it.
diff --git a/automation/templates.mdx b/automation/templates.mdx
deleted file mode 100644
index 51e84dd..0000000
--- a/automation/templates.mdx
+++ /dev/null
@@ -1,89 +0,0 @@
----
-title: "Workflow templates for video automation"
-sidebarTitle: "Templates"
-description: "Start from n8n workflows that render quote videos in any language and run FFmpeg commands on n8n Cloud, with setup steps inside each one."
-icon: "layer-group"
-keywords: ["n8n templates", "n8n video templates", "n8n ffmpeg template", "n8n quote video", "youtube shorts automation", "google sheets to video", "n8n cloud ffmpeg", "rendobar templates"]
-canonical: "https://rendobar.com/docs/automation/templates"
----
-
-
-
-Each template is a finished n8n workflow built on the [Rendobar node](/automation/n8n). Import it, connect the accounts it names, and run it on n8n Cloud. None of them needs FFmpeg installed or the Execute Command node.
-
-## Import a template
-
-1. Copy the workflow JSON link from the template's section below.
-2. In n8n, open a new workflow, open the workflow menu, and choose **Import from URL**. You can also download the file and choose **Import from File**.
-3. Add your Rendobar API credential on every Rendobar node, then connect the other apps the workflow uses.
-4. Follow the yellow sticky note. It lists the choices left to you, such as the folder to watch or the Slack channel.
-
-## Create YouTube quote videos in any language from Google Sheets
-
-
-
-
-
-A new row in a Google Sheet becomes a 10-second 1080x1920 video. The background clip pushes in slowly, the quote fades in line by line over a music bed, and the video uploads to YouTube as private. The workflow then marks the row done.
-
-The quote wraps into balanced lines in a font made for the row's language. Defaults cover 28 languages, and text shaping keeps Arabic letters joined.
-
-| Column | Required | Holds |
-|---|---|---|
-| `quote` | Yes | The text |
-| `background_url` | Yes | A public https link to a clip of at least 10 seconds |
-| `music_url` | Yes | A public https link to the music track |
-| `author` | No | The attribution line under the quote |
-| `language` | No | The language code that picks the default font, such as `ar`, `th` or `ja` |
-| `font` | No | Any Google Fonts family, in place of the default |
-| `font_url`, `font_family` | No | A font file that is not on Google Fonts, and the family name inside that file |
-| `status`, `video_id` | No | Written back by the workflow |
-
-If a Google font does not show, set `font_family` to the name inside the font file. A few files differ from their Google Fonts name. Nanum Gothic's file, for example, says `NanumGothic`.
-
-The workflow uses Google Sheets and YouTube, and the Rendobar operations Job Create (`ffmpeg`) and Job Get.
-
-[Workflow JSON](https://raw.githubusercontent.com/rendobar/n8n-nodes-rendobar/main/templates/quote-videos-from-google-sheets.json)
-
-## Run FFmpeg commands on n8n Cloud with Google Drive and Slack
-
-
-
-
-
-An n8n Form takes a video URL and an FFmpeg command. Rendobar runs the command with the full FFmpeg build, a Wait node parks the execution until the job ends, and the output is saved to Google Drive with its link posted to Slack.
-
-A second branch starts whenever a job fails. It reads the runner's log and posts FFmpeg's error to Slack, which is usually the one line you need when a filter graph refuses to build.
-
-The command names its input `source` and its output `output.mp4`, the way you would type it on your own machine:
-
-```text
--i source -vf scale=-2:720 -c:v libx264 -crf 28 output.mp4
-```
-
-The workflow uses an n8n Form, Google Drive and Slack, and the Rendobar operations Job Create (`ffmpeg`), Job Get, Job Get Logs and the `job.failed` trigger.
-
-[Workflow JSON](https://raw.githubusercontent.com/rendobar/n8n-nodes-rendobar/main/templates/run-ffmpeg-on-n8n-cloud.json)
-
-## See also
-
-- [n8n](/automation/n8n): install the node and add your API key
-- [FFmpeg job](/jobs/ffmpeg): how a command names its inputs and outputs
-- [Callbacks](/guides/callbacks): the callback the Wait node resumes on
-- [Rendobar on n8n.io](https://n8n.io/integrations/rendobar/): the verified listing
diff --git a/automation/zapier.mdx b/automation/zapier.mdx
new file mode 100644
index 0000000..5837148
--- /dev/null
+++ b/automation/zapier.mdx
@@ -0,0 +1,11 @@
+---
+title: "Run media jobs from Zapier"
+sidebarTitle: "Zapier"
+description: "Use Rendobar from Zaps to run video and image jobs. The Zapier app is in progress, and this page covers it once it ships."
+icon: "/images/logos/zapier.svg"
+tag: "Soon"
+noindex: true
+canonical: "https://rendobar.com/docs/automation/zapier"
+---
+
+The Rendobar app for Zapier is in progress. Until it ships, run Rendobar jobs from the [n8n node](/automation/n8n) or the [Activepieces piece](/automation/activepieces).
diff --git a/docs.json b/docs.json
index efa795d..957a618 100644
--- a/docs.json
+++ b/docs.json
@@ -80,13 +80,13 @@
},
{
"group": "Automation",
- "icon": "diagram-project",
+ "icon": "bolt",
"pages": [
"automation/index",
"automation/n8n",
"automation/activepieces",
- "automation/templates",
- "automation/http"
+ "automation/make",
+ "automation/zapier"
]
},
{
@@ -199,6 +199,14 @@
"source": "/n8n/:slug*",
"destination": "/automation/n8n"
},
+ {
+ "source": "/automation/http",
+ "destination": "/automation"
+ },
+ {
+ "source": "/automation/templates",
+ "destination": "/automation#templates"
+ },
{
"source": "/guides/ffmpeg",
"destination": "/jobs/ffmpeg"
diff --git a/images/automation/hero-activepieces.png b/images/automation/hero-activepieces.png
index c2c03d5..7c4892f 100644
Binary files a/images/automation/hero-activepieces.png and b/images/automation/hero-activepieces.png differ
diff --git a/images/automation/hero-http.png b/images/automation/hero-http.png
deleted file mode 100644
index 36e58e1..0000000
Binary files a/images/automation/hero-http.png and /dev/null differ
diff --git a/images/automation/hero-n8n.png b/images/automation/hero-n8n.png
index 3b7f88c..e49113e 100644
Binary files a/images/automation/hero-n8n.png and b/images/automation/hero-n8n.png differ
diff --git a/images/automation/hero-overview.png b/images/automation/hero-overview.png
index 4cf1caf..fc2ea14 100644
Binary files a/images/automation/hero-overview.png and b/images/automation/hero-overview.png differ
diff --git a/images/logos/zapier.svg b/images/logos/zapier.svg
index 09a5cda..1210b87 100644
--- a/images/logos/zapier.svg
+++ b/images/logos/zapier.svg
@@ -1 +1 @@
-
+
diff --git a/images/n8n/install-detail.png b/images/n8n/install-detail.png
index c3136a0..017c3d0 100644
Binary files a/images/n8n/install-detail.png and b/images/n8n/install-detail.png differ
diff --git a/images/n8n/install-from-canvas.png b/images/n8n/install-from-canvas.png
deleted file mode 100644
index 2d5c08c..0000000
Binary files a/images/n8n/install-from-canvas.png and /dev/null differ
diff --git a/images/n8n/template-captions.png b/images/n8n/template-captions.png
deleted file mode 100644
index 5bf1eff..0000000
Binary files a/images/n8n/template-captions.png and /dev/null differ
diff --git a/images/n8n/template-compress.png b/images/n8n/template-compress.png
deleted file mode 100644
index 2bab198..0000000
Binary files a/images/n8n/template-compress.png and /dev/null differ
diff --git a/images/n8n/template-ffmpeg.png b/images/n8n/template-ffmpeg.png
deleted file mode 100644
index 942a9d9..0000000
Binary files a/images/n8n/template-ffmpeg.png and /dev/null differ
diff --git a/images/templates/run-ffmpeg-canvas.png b/images/templates/run-ffmpeg-canvas.png
index 009acd3..4158817 100644
Binary files a/images/templates/run-ffmpeg-canvas.png and b/images/templates/run-ffmpeg-canvas.png differ
diff --git a/scripts/check-template-links.mjs b/scripts/check-template-links.mjs
index 6e30fd6..82669c0 100644
--- a/scripts/check-template-links.mjs
+++ b/scripts/check-template-links.mjs
@@ -1,15 +1,15 @@
#!/usr/bin/env node
/**
- * Keeps the templates page honest about the workflows it links.
+ * Keeps the template cards honest about the workflows they link.
*
- * Every H2 section on automation/templates.mdx that links a workflow JSON in
+ * Every card on automation/index.mdx that links a workflow JSON in
* rendobar/n8n-nodes-rendobar must:
*
* 1. link a file that exists on that repo's main branch, and
* 2. carry the exact title that repo's templates/README.md gives the file.
*
* Titles are rewritten for the n8n Creator Portal in the templates repo first,
- * so a heading copied here by hand drifts without either repo noticing. A
+ * so a card title copied here by hand drifts without either repo noticing. A
* template renamed or deleted there fails this check here.
*
* Needs network access to raw.githubusercontent.com.
@@ -22,7 +22,8 @@ import { fileURLToPath } from 'url';
const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
const RAW = 'https://raw.githubusercontent.com/rendobar/n8n-nodes-rendobar/main/templates/';
-const LINK = /https:\/\/raw\.githubusercontent\.com\/rendobar\/n8n-nodes-rendobar\/main\/templates\/([\w.-]+\.json)/g;
+// A whose title comes before an href into the templates folder.
+const CARD = /]*?title="([^"]+)"[^>]*?href="https:\/\/raw\.githubusercontent\.com\/rendobar\/n8n-nodes-rendobar\/main\/templates\/([\w.-]+\.json)"/g;
const readmeResponse = await fetch(`${RAW}README.md`);
if (!readmeResponse.ok) {
@@ -36,41 +37,31 @@ const titles = new Map(
[...readme.matchAll(/^\| \[([^\]]+)\]\(\.\/([\w.-]+\.json)\) \|/gm)].map((m) => [m[2], m[1]])
);
-const page = readFileSync(join(ROOT, 'automation', 'templates.mdx'), 'utf8');
-const sections = page
- .split(/^## /m)
- .slice(1)
- .map((chunk) => {
- const newline = chunk.indexOf('\n');
- return { heading: chunk.slice(0, newline).trim(), body: chunk.slice(newline) };
- });
-
+const page = readFileSync(join(ROOT, 'automation', 'index.mdx'), 'utf8');
const violations = [];
let linked = 0;
-for (const { heading, body } of sections) {
- for (const file of new Set([...body.matchAll(LINK)].map((m) => m[1]))) {
- linked++;
- const response = await fetch(`${RAW}${file}`, { method: 'HEAD' });
- if (!response.ok) {
- violations.push(`"${heading}" links templates/${file}, which returns HTTP ${response.status} on main.`);
- }
- const title = titles.get(file);
- if (title === undefined) {
- violations.push(`templates/${file} has no row in the templates README, so its title cannot be checked.`);
- } else if (title !== heading) {
- violations.push(`The section "${heading}" links templates/${file}, whose README title is "${title}".`);
- }
+for (const [, title, file] of page.matchAll(CARD)) {
+ linked++;
+ const response = await fetch(`${RAW}${file}`, { method: 'HEAD' });
+ if (!response.ok) {
+ violations.push(`The card "${title}" links templates/${file}, which returns HTTP ${response.status} on main.`);
+ }
+ const expected = titles.get(file);
+ if (expected === undefined) {
+ violations.push(`templates/${file} has no row in the templates README, so its title cannot be checked.`);
+ } else if (expected !== title) {
+ violations.push(`The card "${title}" links templates/${file}, whose README title is "${expected}".`);
}
}
-// A page rewrite that changes the link format would otherwise pass with nothing checked.
+// A page rewrite that changes the card format would otherwise pass with nothing checked.
if (linked === 0) {
- violations.push('automation/templates.mdx links no workflow JSON that this check recognises.');
+ violations.push('automation/index.mdx has no template card this check recognises.');
}
if (violations.length === 0) {
- console.log(`Checked ${linked} template links against the n8n templates repo. All consistent.`);
+ console.log(`Checked ${linked} template cards against the n8n templates repo. All consistent.`);
process.exit(0);
}
diff --git a/scripts/render-heroes.mjs b/scripts/render-heroes.mjs
index 027f665..7d68121 100644
--- a/scripts/render-heroes.mjs
+++ b/scripts/render-heroes.mjs
@@ -21,15 +21,11 @@ import { fileURLToPath, pathToFileURL } from 'url';
const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
const OUT = join(ROOT, 'images', 'automation');
+const WIDTH = 2400;
+const HEIGHT = 900;
const logo = (name) => readFileSync(join(ROOT, 'images', 'logos', `${name}.svg`), 'utf8');
-// A globe for "any tool over HTTP". Not a brand, so it is drawn here.
-const HTTP_ICON =
- '';
-
// Make's purple sits too close to the dark tile to read, so its mark is drawn
// in the tile's light ink and the brand colour carries the glow instead.
const TILES = {
@@ -37,14 +33,15 @@ const TILES = {
activepieces: { svg: logo('activepieces'), glow: '129, 66, 227' },
make: { svg: logo('make').replace('fill="#6D00CC"', 'fill="#F2F5F3"'), glow: '109, 0, 204' },
zapier: { svg: logo('zapier'), glow: '255, 79, 0' },
- http: { svg: HTTP_ICON, glow: '52, 211, 153' },
};
+// Captions describe what the page is about, never which platforms are live, so
+// shipping a new integration does not date the image.
const HEROES = [
{
file: 'hero-overview.png',
- tiles: ['n8n', 'activepieces', 'http'],
- caption: 'n8n, Activepieces, and any tool that can send an HTTP request',
+ tiles: ['n8n', 'activepieces', 'make', 'zapier'],
+ caption: 'Video and image jobs inside your workflows',
},
{ file: 'hero-n8n.png', tiles: ['n8n'], caption: 'A verified node for n8n Cloud and self-hosted n8n' },
{
@@ -52,72 +49,116 @@ const HEROES = [
tiles: ['activepieces'],
caption: 'Flows pause on a waitpoint until the job finishes',
},
- { file: 'hero-http.png', tiles: ['make', 'zapier', 'http'], caption: 'Make, Zapier, and any tool with an HTTP step' },
];
+// Tile and logo sizes. With several platforms Rendobar is the larger hub they
+// connect to. One to one, both sides are the same size.
+const TILE = { size: 210, radius: 48, logo: 104 };
+const HUB = { size: 300, radius: 68, logo: 162 };
+
+// Where the Rendobar tile and the platform tiles sit. One platform sits to the
+// right of Rendobar. Four split two on each side.
+function layout(count) {
+ const cy = 400;
+ if (count === 1) {
+ return { hub: { x: 930, y: cy, ...TILE }, tiles: [{ x: 1470, y: cy, side: 1 }] };
+ }
+ const rows = [cy - 150, cy + 150];
+ const left = rows.map((y) => ({ x: 540, y, side: -1 }));
+ const right = rows.map((y) => ({ x: WIDTH - 540, y, side: 1 }));
+ return { hub: { x: WIDTH / 2, y: cy, ...HUB }, tiles: [...left, ...right].slice(0, count) };
+}
+
+// A horizontal S-curve from the Rendobar tile's edge to the platform tile's edge,
+// with a dot at its midpoint.
+function connector(hub, tile) {
+ const start = { x: hub.x + tile.side * (hub.size / 2), y: hub.y };
+ const end = { x: tile.x - tile.side * (TILE.size / 2), y: tile.y };
+ const midX = (start.x + end.x) / 2;
+ const c1 = { x: midX, y: start.y };
+ const c2 = { x: midX, y: end.y };
+ // The midpoint of a cubic Bezier is (P0 + 3*C1 + 3*C2 + P3) / 8.
+ const dot = {
+ x: (start.x + 3 * c1.x + 3 * c2.x + end.x) / 8,
+ y: (start.y + 3 * c1.y + 3 * c2.y + end.y) / 8,
+ };
+ return { d: `M${start.x} ${start.y} C${c1.x} ${c1.y} ${c2.x} ${c2.y} ${end.x} ${end.y}`, start, end, dot };
+}
+
function page({ tiles, caption }) {
- const tileHtml = tiles
- .map((name) => {
- const t = TILES[name];
- return `