This workflow corresponds to n8n.io template #13823 — we link there as the canonical source.
This workflow follows the HTTP Request → Slack recipe pattern — see all workflows that pair these two integrations.
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 →
{
"id": "mnDXe936xoieG86s",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "n8n Windsurf Deployment: Build, Test & Deploy AI Projects",
"tags": [],
"nodes": [
{
"id": "6c404a74-24fa-4751-85aa-4254d75c9190",
"name": "Overview & Instructions",
"type": "n8n-nodes-base.stickyNote",
"position": [
-64,
528
],
"parameters": {
"width": 1100,
"height": 826,
"content": "This is a conceptual / starter workflow that triggers on git events (or schedule), runs Windsurf-powered build & test steps (via API or CLI wrapper), builds Docker if needed, pushes to registry, deploys to a target platform (e.g. Vercel / Render example), and notifies.\n\n### What\u2019s the Goal?\nProvide a no/low-code CI/CD pipeline for AI projects using Windsurf\u2019s AI coding & deployment capabilities inside n8n \u2014 no external GitHub Actions / Jenkins needed.\n\n### Why Does It Matter?\nAI projects evolve rapidly \u2192 manual deploy is slow & error-prone. Windsurf + n8n keeps model code, keys & inference private while automating quality gates & deployments.\n\n### How It Works\n1. Git webhook / schedule starts flow\n2. Clone latest code\n3. Trigger Windsurf build + test (lint, unit tests, model eval)\n4. If tests pass \u2192 build Docker image\n5. Push image to registry\n6. Deploy to target (Vercel / Render / Railway / Fly.io / K8s)\n7. Notify success / failure\n\n### Configuration Requirements\n- Git provider webhook / token\n- Windsurf API key or self-hosted runner access\n- Docker registry credentials\n- Deployment target token (Vercel / Render / etc.)\n- Notification (Slack / Email)\n\n### Setup Guide\n1. Import workflow\n2. Connect credentials (Git, Windsurf, Docker, Deploy target, Slack)\n3. Configure Set node: repo URL, branch, Windsurf profile, deploy target\n4. Test manually first\n5. Activate webhook \u2192 push code to trigger\n6. Monitor & tune failure branches\n\n"
},
"typeVersion": 1
},
{
"id": "40089a37-f6fb-4d51-80da-e569111e8568",
"name": "1. Trigger",
"type": "n8n-nodes-base.stickyNote",
"position": [
1136,
544
],
"parameters": {
"color": 3,
"width": 460,
"height": 720,
"content": "## 1. Trigger & Input\nGit event or schedule \u2192 prepare repo info"
},
"typeVersion": 1
},
{
"id": "0c1bbe03-f774-4328-ab62-8e6be7eea50c",
"name": "2. Windsurf Phase",
"type": "n8n-nodes-base.stickyNote",
"position": [
1616,
528
],
"parameters": {
"color": 5,
"width": 668,
"height": 700,
"content": "## 2. Windsurf Build & Test\nAI-powered lint, test, eval via Windsurf"
},
"typeVersion": 1
},
{
"id": "1e1ac957-5ba7-4cea-8749-f2b3d847bbb1",
"name": "3. Container Phase",
"type": "n8n-nodes-base.stickyNote",
"position": [
2304,
528
],
"parameters": {
"color": 4,
"width": 396,
"height": 680,
"content": "## 3. Container & Push\nDocker build \u2192 registry push"
},
"typeVersion": 1
},
{
"id": "7352141a-5c67-44da-baf4-76d5d86021e8",
"name": "4. Deploy & Output",
"type": "n8n-nodes-base.stickyNote",
"position": [
2736,
528
],
"parameters": {
"color": 3,
"width": 484,
"height": 676,
"content": "## 4. Deploy & Notify\nTarget platform + alerts"
},
"typeVersion": 1
},
{
"id": "a3731c11-af2e-4b77-b308-9ede7c56dcac",
"name": "Webhook: Git Push / Tag",
"type": "n8n-nodes-base.webhook",
"position": [
1232,
912
],
"parameters": {
"path": "windsurf-deploy-hook",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2
},
{
"id": "d02830bd-a717-47c6-9626-3eaec4fd399a",
"name": "Daily Check (fallback)",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
1232,
1104
],
"parameters": {
"rule": {
"interval": [
{}
]
}
},
"typeVersion": 1.3
},
{
"id": "10641ade-9ce8-4ce6-b8ef-504d389cf606",
"name": "Set Project Config",
"type": "n8n-nodes-base.set",
"position": [
1456,
1008
],
"parameters": {
"values": {
"string": [
{
"name": "repo_url",
"value": "https://github.com/your-org/your-ai-project.git"
},
{
"name": "branch",
"value": "main"
},
{
"name": "windsurf_profile",
"value": "ai-build-test"
},
{
"name": "deploy_platform",
"value": "vercel"
}
]
},
"options": {}
},
"typeVersion": 2
},
{
"id": "dcade103-7d66-4036-a2b3-ae75eee9df07",
"name": "Git: Get Latest Commit",
"type": "n8n-nodes-base.httpRequest",
"position": [
1680,
1008
],
"parameters": {
"url": "https://api.github.com/repos/{{ $json.repo_url.split('/').slice(-2).join('/') }}/commits/{{ $json.branch }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "d3a7a00b-8732-472e-b371-8ab402010385",
"name": "Windsurf: Build & Test",
"type": "n8n-nodes-base.httpRequest",
"position": [
2112,
1008
],
"parameters": {
"url": "https://api.windsurf.dev/v1/run",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "fbba611f-c59b-4d1f-b7cb-2e627bddbb01",
"name": "Build & Tests OK?",
"type": "n8n-nodes-base.if",
"position": [
2336,
1008
],
"parameters": {
"conditions": {
"boolean": [
{
"value1": "={{ $json.build_success === true || $json.tests_passed === true }}"
}
]
}
},
"typeVersion": 1
},
{
"id": "8b23b505-9dd4-4561-bda1-c47b18ec6dfe",
"name": "Docker: Build & Push (placeholder)",
"type": "n8n-nodes-base.httpRequest",
"position": [
2560,
944
],
"parameters": {
"url": "https://registry.hub.docker.com/v2/repositories/yourusername/ai-project/tags/latest",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "70a04462-5edf-4bb9-9dff-534dab30142a",
"name": "Deploy \u2192 Vercel (example)",
"type": "n8n-nodes-base.httpRequest",
"position": [
2784,
944
],
"parameters": {
"url": "https://api.vercel.com/v13/deployments",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "8d49bd41-c3b2-4e41-b325-8f887159a013",
"name": "Notify Slack",
"type": "n8n-nodes-base.slack",
"position": [
3008,
1008
],
"parameters": {
"text": "={{ $json.success ? '\ud83d\ude80 AI Project Deployed successfully!\\nURL: ' + $json.deploy_url : '\u274c Build / Deploy failed: ' + $json.error_message }}",
"channel": "ci-cd-notifications",
"attachments": [],
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "e42515c8-ffb5-4df9-8c12-ef875cfb4f86",
"name": "Wait For Data",
"type": "n8n-nodes-base.wait",
"position": [
1888,
1008
],
"parameters": {},
"typeVersion": 1.1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "95bf1d70-d056-4c8f-b590-f799eaac0eef",
"connections": {
"Wait For Data": {
"main": [
[
{
"node": "Windsurf: Build & Test",
"type": "main",
"index": 0
}
]
]
},
"Build & Tests OK?": {
"main": [
[
{
"node": "Docker: Build & Push (placeholder)",
"type": "main",
"index": 0
}
],
[
{
"node": "Notify Slack",
"type": "main",
"index": 0
}
]
]
},
"Set Project Config": {
"main": [
[
{
"node": "Git: Get Latest Commit",
"type": "main",
"index": 0
}
]
]
},
"Daily Check (fallback)": {
"main": [
[
{
"node": "Set Project Config",
"type": "main",
"index": 0
}
]
]
},
"Git: Get Latest Commit": {
"main": [
[
{
"node": "Wait For Data",
"type": "main",
"index": 0
}
]
]
},
"Windsurf: Build & Test": {
"main": [
[
{
"node": "Build & Tests OK?",
"type": "main",
"index": 0
}
]
]
},
"Webhook: Git Push / Tag": {
"main": [
[
{
"node": "Set Project Config",
"type": "main",
"index": 0
}
]
]
},
"Deploy \u2192 Vercel (example)": {
"main": [
[
{
"node": "Notify Slack",
"type": "main",
"index": 0
}
]
]
},
"Docker: Build & Push (placeholder)": {
"main": [
[
{
"node": "Deploy \u2192 Vercel (example)",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
slackApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This is a conceptual / starter workflow that triggers on git events (or schedule), runs Windsurf-powered build & test steps (via API or CLI wrapper), builds Docker if needed, pushes to registry, deploys to a target platform (e.g. Vercel / Render example), and notifies.
Source: https://n8n.io/workflows/13823/ — 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.
HR teams, IT Operations, and System Administrators managing employee onboarding at scale. It’s perfect if you use Odoo 18 to trigger account requests and need Redmine + GitLab accounts created instant
This workflow is a complete, production-ready solution for recovering abandoned carts in Shopify stores using a multi-channel, multi-touch approach. It automates personalized follow-ups via Email, SMS
This workflow automates end-to-end research analysis by coordinating multiple AI models—including NVIDIA NIM (Llama), OpenAI GPT-4, and Claude to analyze uploaded documents, extract insights, and gene
Are you tired of the repetitive dance between git push, creating a pull request in GitHub, updating the corresponding task in JIRA, and then manually notifying your team in Slack, or Notion?
This workflow automatically detects changes in the .env.staging file in a GitHub repository and keeps Android configuration files (build.gradle and gradle.properties) in sync.It creates a new Git bran