From 093b550af315c0a58ab108b9aba55e54302245c4 Mon Sep 17 00:00:00 2001 From: Jesus Date: Tue, 6 Oct 2026 13:18:53 +0200 Subject: [PATCH 1/5] Describe 0.2.0 in the changelog --- CHANGELOG.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e441d64..7bdfaa0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,41 @@ # Changelog +## 0.2.0 — 2026-10-06 + +Adds AI generation of images, video and audio. + +### Added + +- **Generation** resource, for one AI image, video or audio file without + rendering a whole edit. Shotstack bills generation in credits per asset, in + Sandbox and in Production. +- **Generation → Generate Asset** — `POST /generate` with an asset type, a + prompt, and optionally a model and its options. **Wait for the Asset** is on + by default, so the step returns the finished URL rather than a job ID. + **Give Up After** defaults to 5 minutes and allows 10: n8n runs items one at a + time, so six waiting items at the maximum reach its one-hour limit. + Generating the same asset twice returns the first result and is not billed + again. +- **Generation → Quote Generation** — `POST /generate/quote`, the credits a + generation would cost. It takes the same fields, starts no job and spends + nothing. +- **Generation → Get Generation Status** — `GET /generate/{id}`, for a + generation submitted without waiting. +- **Generation → List Generation Models** — `GET /models`, one item per model + the account can use, each with the options it accepts. Point an AI agent here + before it generates anything. +- The Model picker lists the account's models for the chosen asset type, so a + newly launched model needs no release of this node. +- The wait stops as soon as waiting cannot help: a refused API key, a + generation Shotstack reports it does not have, or a failed generation. A + prompt that is not text, a Clip Length that is not a number, and Model + Options that are not a JSON object are refused before anything is billed. + +### Changed + +- **Render → Render Asset** refuses an Edit of `{}` as empty before it reaches + Shotstack, and names an Edit that is not a JSON object as such. + ## 0.1.0 — 2026-08-24 First version. Published as `@shotstack/n8n-nodes-shotstack`. From fb4ba6ae59376c1698258ea33839c066a20cf6ae Mon Sep 17 00:00:00 2001 From: Jesus Date: Tue, 6 Oct 2026 13:24:21 +0200 Subject: [PATCH 2/5] Match the released version, 0.2.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index d28cea7..c1bc6c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@shotstack/n8n-nodes-shotstack", - "version": "0.1.1", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@shotstack/n8n-nodes-shotstack", - "version": "0.1.1", + "version": "0.2.0", "license": "MIT", "devDependencies": { "@n8n/node-cli": "^0.44.4", diff --git a/package.json b/package.json index 558d3c9..96b12cd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@shotstack/n8n-nodes-shotstack", - "version": "0.1.1", + "version": "0.2.0", "description": "Render video and images from JSON with the Shotstack API", "license": "MIT", "homepage": "https://shotstack.io", From d91e71b6d8e514dbc08e61e16ccd8ff9594e4c39 Mon Sep 17 00:00:00 2001 From: Jesus Date: Wed, 7 Oct 2026 16:23:16 +0200 Subject: [PATCH 3/5] Read the codex into the node description, where n8n's catalog looks --- nodes/Shotstack/Shotstack.node.ts | 8 ++++++++ test/package-loads.mjs | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/nodes/Shotstack/Shotstack.node.ts b/nodes/Shotstack/Shotstack.node.ts index f5699ee..9c24bc0 100644 --- a/nodes/Shotstack/Shotstack.node.ts +++ b/nodes/Shotstack/Shotstack.node.ts @@ -6,6 +6,7 @@ import { TELEMETRY_HEADERS } from './telemetry'; import { EDIT_BASE_URL } from './environment'; import { getTemplates } from './listSearch/getTemplates'; import { getModels } from './loadOptions/getModels'; +import codexFile from './Shotstack.node.json'; export class Shotstack implements INodeType { description: INodeTypeDescription = { @@ -21,6 +22,13 @@ export class Shotstack implements INodeType { // the reader which of the three a bare id belongs to. subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', description: 'Render video and images from JSON with the Shotstack API', + // n8n's catalog of verified nodes, which the Nodes panel searches, reads + // categories and search words from the description, not the codex file. + codex: { + categories: codexFile.categories, + alias: codexFile.alias, + resources: codexFile.resources, + }, defaults: { name: 'Shotstack', }, diff --git a/test/package-loads.mjs b/test/package-loads.mjs index 3999c61..8ef7bd8 100644 --- a/test/package-loads.mjs +++ b/test/package-loads.mjs @@ -139,6 +139,16 @@ check('the codex file names the node the way n8n registers it', () => { } }); +check('the description carries the search words', () => { + // n8n's catalog of verified nodes reads them from the description, and + // stored an empty record while they lived only in the codex file. + for (const relative of manifest.n8n.nodes) { + const { instance } = load(relative); + const codex = require(resolve(root, relative.replace(/\.js$/, '.json'))); + assert.deepEqual(instance.description.codex?.alias, codex.alias); + } +}); + check('every operation is reachable from a resource', () => { const { instance } = load(manifest.n8n.nodes[0]); const properties = instance.description.properties; From 134d215ef9972325f99fe91e0153afc56de40f46 Mon Sep 17 00:00:00 2001 From: Jesus Date: Wed, 7 Oct 2026 16:23:16 +0200 Subject: [PATCH 4/5] Add search words for AI generation, shorts and video editing --- nodes/Shotstack/Shotstack.node.json | 33 ++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/nodes/Shotstack/Shotstack.node.json b/nodes/Shotstack/Shotstack.node.json index 48500dd..d32448a 100644 --- a/nodes/Shotstack/Shotstack.node.json +++ b/nodes/Shotstack/Shotstack.node.json @@ -3,7 +3,38 @@ "nodeVersion": "1.0", "codexVersion": "1.0", "categories": ["Marketing & Content", "Utility"], - "alias": ["video", "render", "edit", "mp4", "reel", "short", "caption", "subtitle", "avatar"], + "alias": [ + "video", + "render", + "edit", + "mp4", + "reel", + "short", + "caption", + "subtitle", + "avatar", + "text to video", + "image to video", + "AI video", + "text to speech", + "TTS", + "voiceover", + "AI voice", + "AI image", + "image generation", + "text to image", + "shorts", + "reels", + "TikTok", + "YouTube Shorts", + "faceless", + "subtitles", + "captions", + "merge videos", + "watermark", + "slideshow", + "FFmpeg" + ], "resources": { "credentialDocumentation": [ { From e73eb5b6b918afbe44aae94d200d452b331d8cda Mon Sep 17 00:00:00 2001 From: Jesus Date: Wed, 7 Oct 2026 16:23:17 +0200 Subject: [PATCH 5/5] Describe 0.2.1 in the changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bdfaa0..d249c82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.2.1 — 2026-10-07 + +Adds search words, so n8n's Nodes panel finds Shotstack when people search for +what it makes, such as "text to video", "text to speech", "AI image", "shorts", +"subtitles" or "FFmpeg". + ## 0.2.0 — 2026-10-06 Adds AI generation of images, video and audio.