The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "Brief Form \u2192 AI Director",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "taskade/brief-form",
"responseMode": "responseNode",
"options": {}
},
"id": "webhook-in",
"name": "Webhook: brief-form",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
240,
400
],
"notes": "POST {WEBHOOK_URL}webhook/taskade/brief-form\nBody: {\"briefText\":\"...\", \"conceptProjectId\":\"...\", \"mode\":\"brief|angles|check|strat|translate\"}\nPaste the real Director system prompts into the five 'System:*' Set nodes below \u2014 pull them from /Users/kindofworking/AI/docs/taskade_director/_director_core.md."
},
{
"parameters": {
"values": {
"string": [
{
"name": "briefText",
"value": "={{$json.body.briefText}}"
},
{
"name": "conceptProjectId",
"value": "={{$json.body.conceptProjectId}}"
},
{
"name": "mode",
"value": "={{$json.body.mode}}"
}
]
},
"options": {}
},
"id": "extract",
"name": "Extract payload",
"type": "n8n-nodes-base.set",
"typeVersion": 3,
"position": [
460,
400
]
},
{
"parameters": {
"dataType": "string",
"value1": "={{$json.mode}}",
"rules": {
"rules": [
{
"value2": "brief",
"output": 0
},
{
"value2": "angles",
"output": 1
},
{
"value2": "check",
"output": 2
},
{
"value2": "strat",
"output": 3
},
{
"value2": "translate",
"output": 4
}
]
},
"fallbackOutput": 0
},
"id": "switch-mode",
"name": "Switch on mode",
"type": "n8n-nodes-base.switch",
"typeVersion": 3,
"position": [
680,
400
]
},
{
"parameters": {
"values": {
"string": [
{
"name": "systemPrompt",
"value": "You are the Ruflo AI Director running in BRIEF mode.\nTransform the user's rough brief into a clean creative brief with sections: Objective, Target, Proof, Promise, Tone, Must-haves, Avoid. Keep it under 250 words.\n\n<!-- Replace this text with the full BRIEF mode system prompt from /Users/kindofworking/AI/docs/taskade_director/_director_core.md -->"
}
]
},
"options": {}
},
"id": "sys-brief",
"name": "System: brief",
"type": "n8n-nodes-base.set",
"typeVersion": 3,
"position": [
900,
180
]
},
{
"parameters": {
"values": {
"string": [
{
"name": "systemPrompt",
"value": "You are the Ruflo AI Director running in ANGLES mode.\nProduce 5-7 distinct creative angles for the brief, each with hook, proof, payoff.\n\n<!-- Replace this with the full ANGLES prompt -->"
}
]
},
"options": {}
},
"id": "sys-angles",
"name": "System: angles",
"type": "n8n-nodes-base.set",
"typeVersion": 3,
"position": [
900,
300
]
},
{
"parameters": {
"values": {
"string": [
{
"name": "systemPrompt",
"value": "You are the Ruflo AI Director running in CHECK mode.\nReview the brief for gaps, contradictions, brand-fit issues. Flag the top 3 risks.\n\n<!-- Replace this with the full CHECK prompt -->"
}
]
},
"options": {}
},
"id": "sys-check",
"name": "System: check",
"type": "n8n-nodes-base.set",
"typeVersion": 3,
"position": [
900,
420
]
},
{
"parameters": {
"values": {
"string": [
{
"name": "systemPrompt",
"value": "You are the Ruflo AI Director running in STRAT mode.\nDevelop a 1-page strategic frame: positioning, audience insight, reason to believe, cultural moment.\n\n<!-- Replace this with the full STRAT prompt -->"
}
]
},
"options": {}
},
"id": "sys-strat",
"name": "System: strat",
"type": "n8n-nodes-base.set",
"typeVersion": 3,
"position": [
900,
540
]
},
{
"parameters": {
"values": {
"string": [
{
"name": "systemPrompt",
"value": "You are the Ruflo AI Director running in TRANSLATE mode.\nTranslate the brief across DE/EN with cultural nuance. Preserve tone.\n\n<!-- Replace this with the full TRANSLATE prompt -->"
}
]
},
"options": {}
},
"id": "sys-translate",
"name": "System: translate",
"type": "n8n-nodes-base.set",
"typeVersion": 3,
"position": [
900,
660
]
},
{
"parameters": {
"mode": "mergeByPosition",
"options": {}
},
"id": "merge",
"name": "Merge prompt branches",
"type": "n8n-nodes-base.merge",
"typeVersion": 3,
"position": [
1140,
400
]
},
{
"parameters": {
"url": "https://api.anthropic.com/v1/messages",
"method": "POST",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "x-api-key",
"value": "={{$env.ANTHROPIC_API_KEY}}"
},
{
"name": "anthropic-version",
"value": "2023-06-01"
},
{
"name": "content-type",
"value": "application/json"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"model\": \"claude-sonnet-4-5-20250929\",\n \"max_tokens\": 4096,\n \"system\": \"{{ ($json.systemPrompt || '').replace(/\\\"/g, '\\\\\\\"').replace(/\\n/g, '\\\\n') }}\",\n \"messages\": [\n { \"role\": \"user\", \"content\": \"{{ ($('Extract payload').first().json.briefText || '').replace(/\\\"/g, '\\\\\\\"').replace(/\\n/g, '\\\\n') }}\" }\n ]\n}",
"options": {
"response": {
"response": {
"responseFormat": "json",
"neverError": false
}
},
"timeout": 120000
}
},
"id": "anthropic-call",
"name": "Anthropic: Messages",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1360,
400
],
"notes": "Falls back to claude-3-5-sonnet-20241022 if claude-sonnet-4-5 unavailable \u2014 edit the model field."
},
{
"parameters": {
"jsCode": "const resp = $input.first().json;\nconst text = (resp.content && resp.content[0] && resp.content[0].text) || JSON.stringify(resp);\nreturn [{ json: { directorResponse: text, mode: $('Extract payload').first().json.mode, conceptProjectId: $('Extract payload').first().json.conceptProjectId } }];"
},
"id": "extract-text",
"name": "Extract Claude text",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1580,
400
]
},
{
"parameters": {
"url": "=https://www.taskade.com/api/v1/projects/{{$json.conceptProjectId}}/tasks",
"method": "POST",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "=Bearer {{$env.TASKADE_API_KEY}}"
},
{
"name": "Content-Type",
"value": "application/json"
},
{
"name": "Accept",
"value": "application/json"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"tasks\": [\n {\n \"content\": \"[Director/{{$json.mode}}] {{ ($json.directorResponse || '').slice(0, 200).replace(/\\\"/g, '\\\\\\\"').replace(/\\n/g, ' ') }}\",\n \"placement\": \"afterbegin\"\n }\n ]\n}",
"options": {
"response": {
"response": {
"responseFormat": "json"
}
}
}
},
"id": "write-back",
"name": "Taskade: write Director output",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1800,
400
]
},
{
"parameters": {
"url": "http://langfuse:3000/api/public/ingestion",
"method": "POST",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "=Basic {{Buffer.from($env.LANGFUSE_PUBLIC_KEY + ':' + $env.LANGFUSE_SECRET_KEY).toString('base64')}}"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"batch\": [\n {\n \"id\": \"{{$now.toISO()}}-brief-{{$('Extract payload').first().json.mode}}\",\n \"timestamp\": \"{{$now.toISO()}}\",\n \"type\": \"trace-create\",\n \"body\": {\n \"id\": \"brief-{{$now.toMillis()}}\",\n \"name\": \"brief-form/{{$('Extract payload').first().json.mode}}\",\n \"input\": { \"brief\": \"{{ ($('Extract payload').first().json.briefText || '').slice(0, 500) }}\" },\n \"output\": { \"response\": \"{{ ($('Extract Claude text').first().json.directorResponse || '').slice(0, 500) }}\" }\n }\n }\n ]\n}",
"options": {
"response": {
"response": {
"responseFormat": "json",
"neverError": true
}
}
}
},
"id": "langfuse-trace",
"name": "Langfuse: trace brief",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
2020,
400
],
"continueOnFail": true
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={\n \"ok\": true,\n \"mode\": \"{{$('Extract payload').first().json.mode}}\",\n \"output\": \"{{ ($('Extract Claude text').first().json.directorResponse || '').replace(/\\\"/g, '\\\\\\\"') }}\"\n}",
"options": {}
},
"id": "respond",
"name": "Respond",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1,
"position": [
2240,
400
]
}
],
"connections": {
"Webhook: brief-form": {
"main": [
[
{
"node": "Extract payload",
"type": "main",
"index": 0
}
]
]
},
"Extract payload": {
"main": [
[
{
"node": "Switch on mode",
"type": "main",
"index": 0
}
]
]
},
"Switch on mode": {
"main": [
[
{
"node": "System: brief",
"type": "main",
"index": 0
}
],
[
{
"node": "System: angles",
"type": "main",
"index": 0
}
],
[
{
"node": "System: check",
"type": "main",
"index": 0
}
],
[
{
"node": "System: strat",
"type": "main",
"index": 0
}
],
[
{
"node": "System: translate",
"type": "main",
"index": 0
}
]
]
},
"System: brief": {
"main": [
[
{
"node": "Merge prompt branches",
"type": "main",
"index": 0
}
]
]
},
"System: angles": {
"main": [
[
{
"node": "Merge prompt branches",
"type": "main",
"index": 0
}
]
]
},
"System: check": {
"main": [
[
{
"node": "Merge prompt branches",
"type": "main",
"index": 0
}
]
]
},
"System: strat": {
"main": [
[
{
"node": "Merge prompt branches",
"type": "main",
"index": 0
}
]
]
},
"System: translate": {
"main": [
[
{
"node": "Merge prompt branches",
"type": "main",
"index": 0
}
]
]
},
"Merge prompt branches": {
"main": [
[
{
"node": "Anthropic: Messages",
"type": "main",
"index": 0
}
]
]
},
"Anthropic: Messages": {
"main": [
[
{
"node": "Extract Claude text",
"type": "main",
"index": 0
}
]
]
},
"Extract Claude text": {
"main": [
[
{
"node": "Taskade: write Director output",
"type": "main",
"index": 0
}
]
]
},
"Taskade: write Director output": {
"main": [
[
{
"node": "Langfuse: trace brief",
"type": "main",
"index": 0
}
]
]
},
"Langfuse: trace brief": {
"main": [
[
{
"node": "Respond",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1",
"saveExecutionProgress": true,
"saveDataSuccessExecution": "all",
"saveDataErrorExecution": "all",
"timezone": "Europe/Berlin"
},
"tags": [
{
"name": "taskade"
},
{
"name": "director"
},
{
"name": "ruflo"
}
]
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Brief Form → AI Director. Uses httpRequest. Webhook trigger; 14 nodes.
Source: https://gist.github.com/KindOfADev/a6b4d04333c3c1c4f64508bdcc3c9819 — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This n8n template provides enterprise-level version control for your workflows using GitHub integration. Stop losing hours to broken workflows and manual exports – get proper commit history, visual di
This flow creates dummy files for every item added in your *Arrs (Radarr/Sonarr) with the tag .
This workflow acts as a central API gateway for all technical indicator agents in the Binance Spot Market Quant AI system. It listens for incoming webhook requests and dynamically routes them to the c
Sign PDF documents with legally-compliant digital signatures using X.509 certificates. Supports multiple PAdES signature levels (B, T, LT, LTA) with optional visible stamps.
📡 This workflow serves as the central Alpha Vantage API fetcher for Tesla trading indicators, delivering cleaned 20-point JSON outputs for three timeframes: , , and . It is required by the following a