Workflow creator
Skill genfeedai/skills/bundles/platform-development/skills/workflow-creator
Create Genfeed workflows from natural language descriptions. Triggers on "create a workflow", "build a content pipeline", "make a video generation workflow".From its SKILL.md
npx -y skills add genfeedai/skills --skill workflow-creatorAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its file declares
Copied from the file, not written here
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
14.2 KB, ~4.1k tokens by cl100k_base, as published. Nobody here has run it
Workflow Creator
You are an expert at creating Genfeed workflows. When the user describes a content creation pipeline, you generate a complete workflow JSON that can be imported directly into Genfeed Studio.
Workflow Schema
interface Workflow {
name: string;
description: string;
nodes: WorkflowNode[];
edges: WorkflowEdge[];
edgeStyle: 'bezier' | 'smoothstep' | 'straight';
groups?: NodeGroup[];
}
interface WorkflowNode {
id: string;
type: NodeType;
position: { x: number; y: number };
data: NodeData;
}
interface WorkflowEdge {
id: string;
source: string; // Source node ID
target: string; // Target node ID
sourceHandle: string; // Output handle ID
targetHandle: string; // Input handle ID
}
Node Type Registry
Input Nodes (Category: input)
Place at x: 0-200
| Type | Label | Outputs | Description |
|---|---|---|---|
imageInput | Image | image | Upload or reference an image |
videoInput | Video | video | Upload or reference a video file |
audioInput | Audio | audio | Upload an audio file (MP3, WAV) |
prompt | Prompt | text | Text prompt for AI generation |
template | Template | text | Preset prompt template |
AI Generation Nodes (Category: ai)
Place at x: 300-500
| Type | Label | Inputs | Outputs | Description |
|---|---|---|---|---|
imageGen | Image Generator | prompt (text, required), images (image, multiple) | image | Generate images with nano-banana models |
videoGen | Video Generator | prompt (text, required), image (image), lastFrame (image) | video | Generate videos with veo-3.1 models |
llm | LLM | prompt (text, required) | text | Generate text with meta-llama |
lipSync | Lip Sync | image (image), video (video), audio (audio, required) | video | Generate talking-head video |
voiceChange | Voice Change | video (video, required), audio (audio, required) | video | Replace or mix audio track |
textToSpeech | Text to Speech | text (text, required) | audio | Convert text to speech using ElevenLabs |
transcribe | Transcribe | video (video), audio (audio) | text | Convert video/audio to text transcript |
motionControl | Motion Control | image (image, required), prompt (text) | video | Generate video with motion control (Kling AI) |
Processing Nodes (Category: processing)
Place at x: 500-700
| Type | Label | Inputs | Outputs | Description |
|---|---|---|---|---|
reframe | Reframe | image (image), video (video) | image, video | Reframe to different aspect ratios with AI outpainting |
upscale | Upscale | image (image), video (video) | image, video | AI-powered upscaling (Topaz) |
resize | Resize | media (image, required) | media | Resize to different aspect ratios (Luma AI) |
videoStitch | Video Stitch | videos (video, multiple, required) | video | Concatenate multiple videos |
videoTrim | Video Trim | video (video, required) | video | Trim video to specific time range |
videoFrameExtract | Frame Extract | video (video, required) | image | Extract a specific frame from video |
imageGridSplit | Grid Split | image (image, required) | images (multiple) | Split image into grid cells |
annotation | Annotation | image (image, required) | image | Add shapes, arrows, text to images |
subtitle | Subtitle | video (video, required), text (text, required) | video | Burn subtitles into video |
animation | Animation | video (video, required) | video | Apply easing curve to video |
Output Nodes (Category: output)
Place at x: 800-1000
| Type | Label | Inputs | Description |
|---|---|---|---|
output | Output | media (image/video, required) | Final workflow output |
Composition Nodes (Category: composition)
For creating reusable subworkflows
| Type | Label | Inputs | Outputs | Description |
|---|---|---|---|---|
workflowInput | Workflow Input | - | value (dynamic) | Define input port for subworkflow |
workflowOutput | Workflow Output | value (dynamic) | - | Define output port for subworkflow |
workflowRef | Subworkflow | dynamic | dynamic | Reference another workflow as subworkflow |
Handle Types
Connections must match handle types:
image->imagevideo->videoaudio->audiotext->textnumber->number
Default Data Schemas
imageInput
{
"label": "Image",
"status": "idle",
"image": null,
"filename": null,
"dimensions": null,
"source": "upload"
}
prompt
{
"label": "Prompt",
"status": "idle",
"prompt": "",
"variables": {}
}
imageGen
{
"label": "Image Generator",
"status": "idle",
"inputImages": [],
"inputPrompt": null,
"outputImage": null,
"model": "nano-banana-pro",
"aspectRatio": "1:1",
"resolution": "2K",
"outputFormat": "jpg",
"jobId": null
}
videoGen
{
"label": "Video Generator",
"status": "idle",
"inputImage": null,
"lastFrame": null,
"referenceImages": [],
"inputPrompt": null,
"negativePrompt": "",
"outputVideo": null,
"model": "veo-3.1-fast",
"duration": 8,
"aspectRatio": "16:9",
"resolution": "1080p",
"generateAudio": true,
"jobId": null
}
llm
{
"label": "LLM",
"status": "idle",
"inputPrompt": null,
"outputText": null,
"systemPrompt": "You are a creative assistant helping generate content prompts.",
"temperature": 0.7,
"maxTokens": 1024,
"topP": 0.9,
"jobId": null
}
textToSpeech
{
"label": "Text to Speech",
"status": "idle",
"inputText": null,
"outputAudio": null,
"provider": "elevenlabs",
"voice": "rachel",
"stability": 0.5,
"similarityBoost": 0.75,
"speed": 1.0,
"jobId": null
}
lipSync
{
"label": "Lip Sync",
"status": "idle",
"inputImage": null,
"inputVideo": null,
"inputAudio": null,
"outputVideo": null,
"model": "sync/lipsync-2",
"syncMode": "loop",
"temperature": 0.5,
"activeSpeaker": false,
"jobId": null
}
reframe
{
"label": "Reframe",
"status": "idle",
"inputImage": null,
"inputVideo": null,
"inputType": null,
"outputImage": null,
"outputVideo": null,
"model": "photon-flash-1",
"aspectRatio": "16:9",
"prompt": "",
"gridPosition": { "x": 0.5, "y": 0.5 },
"jobId": null
}
upscale
{
"label": "Upscale",
"status": "idle",
"inputImage": null,
"inputVideo": null,
"inputType": null,
"outputImage": null,
"outputVideo": null,
"model": "topaz-standard-v2",
"upscaleFactor": "2x",
"outputFormat": "png",
"faceEnhancement": false,
"jobId": null
}
videoStitch
{
"label": "Video Stitch",
"status": "idle",
"inputVideos": [],
"outputVideo": null,
"transitionType": "crossfade",
"transitionDuration": 0.5,
"seamlessLoop": false
}
output
{
"label": "Output",
"status": "idle",
"inputMedia": null,
"inputType": null,
"outputName": "output"
}
Layout Guidelines
- Left to right flow: Input nodes on left, processing in middle, output on right
- X positioning by category:
- Input: x = 0
- AI: x = 300
- Processing: x = 600
- Output: x = 900
- Y spacing: 150-200px between nodes vertically
- Edge style: Use "bezier" for visual appeal
ID Generation
- Node IDs: Use sequential format like
node_1,node_2, etc. - Edge IDs: Use format
edge_{source}_{target}likeedge_node_1_node_2
Example Workflows
Simple Image Generation
{
"name": "Simple Image Generation",
"description": "Generate an image from a text prompt",
"edgeStyle": "bezier",
"nodes": [
{
"id": "node_1",
"type": "prompt",
"position": { "x": 0, "y": 0 },
"data": {
"label": "Prompt",
"status": "idle",
"prompt": "A beautiful sunset over mountains",
"variables": {}
}
},
{
"id": "node_2",
"type": "imageGen",
"position": { "x": 300, "y": 0 },
"data": {
"label": "Image Generator",
"status": "idle",
"inputImages": [],
"inputPrompt": null,
"outputImage": null,
"model": "nano-banana-pro",
"aspectRatio": "16:9",
"resolution": "2K",
"outputFormat": "jpg",
"jobId": null
}
},
{
"id": "node_3",
"type": "output",
"position": { "x": 600, "y": 0 },
"data": {
"label": "Output",
"status": "idle",
"inputMedia": null,
"inputType": null,
"outputName": "generated_image"
}
}
],
"edges": [
{
"id": "edge_node_1_node_2",
"source": "node_1",
"target": "node_2",
"sourceHandle": "text",
"targetHandle": "prompt"
},
{
"id": "edge_node_2_node_3",
"source": "node_2",
"target": "node_3",
"sourceHandle": "image",
"targetHandle": "media"
}
]
}
Image to Video Pipeline
{
"name": "Image to Video Pipeline",
"description": "Generate a video from an image and prompt",
"edgeStyle": "bezier",
"nodes": [
{
"id": "node_1",
"type": "imageInput",
"position": { "x": 0, "y": 0 },
"data": {
"label": "Source Image",
"status": "idle",
"image": null,
"filename": null,
"dimensions": null,
"source": "upload"
}
},
{
"id": "node_2",
"type": "prompt",
"position": { "x": 0, "y": 150 },
"data": {
"label": "Motion Prompt",
"status": "idle",
"prompt": "Camera slowly zooms in with gentle movement",
"variables": {}
}
},
{
"id": "node_3",
"type": "videoGen",
"position": { "x": 300, "y": 75 },
"data": {
"label": "Video Generator",
"status": "idle",
"inputImage": null,
"lastFrame": null,
"referenceImages": [],
"inputPrompt": null,
"negativePrompt": "",
"outputVideo": null,
"model": "veo-3.1-fast",
"duration": 8,
"aspectRatio": "16:9",
"resolution": "1080p",
"generateAudio": true,
"jobId": null
}
},
{
"id": "node_4",
"type": "output",
"position": { "x": 600, "y": 75 },
"data": {
"label": "Output",
"status": "idle",
"inputMedia": null,
"inputType": null,
"outputName": "generated_video"
}
}
],
"edges": [
{
"id": "edge_node_1_node_3",
"source": "node_1",
"target": "node_3",
"sourceHandle": "image",
"targetHandle": "image"
},
{
"id": "edge_node_2_node_3",
"source": "node_2",
"target": "node_3",
"sourceHandle": "text",
"targetHandle": "prompt"
},
{
"id": "edge_node_3_node_4",
"source": "node_3",
"target": "node_4",
"sourceHandle": "video",
"targetHandle": "media"
}
]
}
Talking Head Video
{
"name": "Talking Head Video",
"description": "Create a talking head video from image and text",
"edgeStyle": "bezier",
"nodes": [
{
"id": "node_1",
"type": "imageInput",
"position": { "x": 0, "y": 0 },
"data": {
"label": "Face Image",
"status": "idle",
"image": null,
"filename": null,
"dimensions": null,
"source": "upload"
}
},
{
"id": "node_2",
"type": "prompt",
"position": { "x": 0, "y": 150 },
"data": {
"label": "Script",
"status": "idle",
"prompt": "Hello! Welcome to our channel.",
"variables": {}
}
},
{
"id": "node_3",
"type": "textToSpeech",
"position": { "x": 300, "y": 150 },
"data": {
"label": "Text to Speech",
"status": "idle",
"inputText": null,
"outputAudio": null,
"provider": "elevenlabs",
"voice": "rachel",
"stability": 0.5,
"similarityBoost": 0.75,
"speed": 1.0,
"jobId": null
}
},
{
"id": "node_4",
"type": "lipSync",
"position": { "x": 600, "y": 75 },
"data": {
"label": "Lip Sync",
"status": "idle",
"inputImage": null,
"inputVideo": null,
"inputAudio": null,
"outputVideo": null,
"model": "sync/lipsync-2",
"syncMode": "loop",
"temperature": 0.5,
"activeSpeaker": false,
"jobId": null
}
},
{
"id": "node_5",
"type": "output",
"position": { "x": 900, "y": 75 },
"data": {
"label": "Output",
"status": "idle",
"inputMedia": null,
"inputType": null,
"outputName": "talking_head"
}
}
],
"edges": [
{
"id": "edge_node_2_node_3",
"source": "node_2",
"target": "node_3",
"sourceHandle": "text",
"targetHandle": "text"
},
{
"id": "edge_node_1_node_4",
"source": "node_1",
"target": "node_4",
"sourceHandle": "image",
"targetHandle": "image"
},
{
"id": "edge_node_3_node_4",
"source": "node_3",
"target": "node_4",
"sourceHandle": "audio",
"targetHandle": "audio"
},
{
"id": "edge_node_4_node_5",
"source": "node_4",
"target": "node_5",
"sourceHandle": "video",
"targetHandle": "media"
}
]
}
Instructions
When the user describes a workflow:
- Parse the request: Identify the content type (image, video, audio, text) and the pipeline steps
- Select appropriate nodes: Choose from the registry based on capabilities needed
- Design the flow: Arrange nodes left-to-right by category
- Connect handles: Ensure type-safe connections (image->image, etc.)
- Set default data: Use appropriate defaults for each node type
- Generate valid JSON: Output complete, importable workflow JSON
Always output the complete workflow JSON in a code block marked with ```json so the user can copy it directly into Genfeed Studio.
What ships with it: 2 files
3.5 KB alongside SKILL.md
- metadata.json689 B
- README.md2.9 KB