N8N-DASHBOARD/poller-v2.n8n.json
David 433cb2b908 Redesign dashboard to match new spec (stats → anomalies → 2-col)
Layout per user-supplied mockup:
- Single header row (title + last sync, no sticky)
- 5-card stats strip (Active / Runs 24h / Succeeded / Errors / Fail rate)
- Single 'Needs attention' panel showing only anomalies (stale, burning, stuck)
- 2-col grid: Workflows (left) + Activity (right) — both compact lists
- Activity rows show error_message inline for failed executions
- Each anomaly / error gets a deep-link to n8n

Also:
- Saved user's static HTML prototype to dashboard/public/preview.html
  (served at /preview.html so they can compare mock vs live)

Bundle: 215 KB JS / 67 KB gzipped (smaller than v2 — removed dead components)
2026-08-24 07:28:23 +02:00

619 lines
No EOL
16 KiB
JSON

{
"name": "n8n Monitoring Dashboard - Poller",
"nodes": [
{
"parameters": {
"content": "## Setup\n1. Create an \"HTTP Header Auth\" credential named \"n8n API Key\" (header X-N8N-API-KEY = your n8n API key).\n2. Create an \"HTTP Header Auth\" credential named \"PocketBase Admin\" (header Authorization = \"Bearer <your PocketBase admin token>\").\n3. PocketBase base URL is pre-set to http://pocketbase-fftm1vu8twxfixup17v82xwe.169.239.180.130.sslip.io \u2014 no change needed.\n4. Collections already created in PocketBase.\n5. Activate this workflow when ready.",
"height": 200,
"width": 300,
"color": 4
},
"id": "24bccdfd-9f10-497e-b2bc-580f6315ccd2",
"name": "Sticky Note 67b8b148",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1056,
272
]
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "minutes"
}
]
}
},
"id": "d3ef4a9b-7f14-4c2c-a0ea-14eeeea28ceb",
"name": "Every 5 Minutes",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-992,
320
]
},
{
"parameters": {
"url": "https://wfdash.n8n.apphub.co.za/api/v1/workflows",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"options": {}
},
"id": "d69f9f84-9a58-42c7-8a03-ab14618b9eeb",
"name": "Fetch n8n Workflows",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
-688,
176
],
"credentials": {
"httpHeaderAuth": {
"id": "6H3KsAmWrPkxYDvZ",
"name": "N8N_API"
}
}
},
{
"parameters": {
"fieldToSplitOut": "data",
"options": {}
},
"id": "7b3c2540-f6d5-48e7-b321-ae5dfebcb5f4",
"name": "Split Workflows Array",
"type": "n8n-nodes-base.splitOut",
"typeVersion": 1,
"position": [
-400,
176
]
},
{
"parameters": {},
"id": "b4a435aa-355e-4560-9867-39fdc9ad6a8d",
"name": "Workflows Sync Done",
"type": "n8n-nodes-base.noOp",
"typeVersion": 1,
"position": [
1104,
176
]
},
{
"parameters": {
"url": "http://pocketbase-fftm1vu8twxfixup17v82xwe.169.239.180.130.sslip.io/api/collections/workflows/records",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "filter",
"value": "=(n8n_id=\"{{ $json.id }}\")"
}
]
},
"options": {}
},
"id": "89d63965-a993-49f7-bb2d-d96dc8f98c74",
"name": "Check Workflow Record Exists",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
176
],
"credentials": {
"httpHeaderAuth": {
"id": "HC4oQ8isTW3CEuSC",
"name": "POCKETBASE"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 1
},
"conditions": [
{
"leftValue": "={{ $json.totalItems }}",
"operator": {
"type": "number",
"operation": "gt"
},
"rightValue": 0
}
],
"combinator": "and"
},
"options": {}
},
"id": "ebbb0f2b-3994-468a-8d91-3066b64e9c2d",
"name": "Workflow Record Exists?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
512,
176
]
},
{
"parameters": {
"method": "PATCH",
"url": "={{ \"http://pocketbase-fftm1vu8twxfixup17v82xwe.169.239.180.130.sslip.io/api/collections/workflows/records/\" + $json.items[0].id }}",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ { \"name\": $(\"Split Workflows Array\").item.json.name, \"active\": $(\"Split Workflows Array\").item.json.active, \"n8n_updated_at\": $(\"Split Workflows Array\").item.json.updatedAt } }}",
"options": {}
},
"id": "59e14242-6059-4bce-b220-14db1c0b2ebe",
"name": "Update Workflow Record",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
800,
80
],
"credentials": {
"httpHeaderAuth": {
"id": "HC4oQ8isTW3CEuSC",
"name": "POCKETBASE"
}
}
},
{
"parameters": {
"options": {}
},
"id": "b6f0ba87-7db6-40df-b7df-bba2cccb00a2",
"name": "Workflows: One At A Time",
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 3,
"position": [
-96,
176
]
},
{
"parameters": {
"method": "POST",
"url": "http://pocketbase-fftm1vu8twxfixup17v82xwe.169.239.180.130.sslip.io/api/collections/workflows/records",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ { \"n8n_id\": $(\"Split Workflows Array\").item.json.id, \"name\": $(\"Split Workflows Array\").item.json.name, \"active\": $(\"Split Workflows Array\").item.json.active, \"n8n_updated_at\": $(\"Split Workflows Array\").item.json.updatedAt } }}",
"options": {}
},
"id": "2d1eecf4-3161-4e7b-ba48-27f847151d9d",
"name": "Create Workflow Record",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
800,
272
],
"credentials": {
"httpHeaderAuth": {
"id": "HC4oQ8isTW3CEuSC",
"name": "POCKETBASE"
}
}
},
{
"parameters": {
"url": "https://wfdash.n8n.apphub.co.za/api/v1/executions",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "limit",
"value": "50"
},
{
"name": "includeData",
"value": "true"
}
]
},
"options": {}
},
"id": "14fcdffc-a949-4a02-b6be-c5574fe075b6",
"name": "Fetch n8n Executions",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
-688,
576
],
"credentials": {
"httpHeaderAuth": {
"id": "6H3KsAmWrPkxYDvZ",
"name": "Header Auth account"
}
}
},
{
"parameters": {
"fieldToSplitOut": "data",
"options": {}
},
"id": "d3b19216-a785-495a-b42d-28f9ac3569d3",
"name": "Split Executions Array",
"type": "n8n-nodes-base.splitOut",
"typeVersion": 1,
"position": [
-400,
576
]
},
{
"parameters": {},
"id": "1efb39c7-4fd6-4c43-83f7-1dda5bfcb81e",
"name": "Executions Sync Done",
"type": "n8n-nodes-base.noOp",
"typeVersion": 1,
"position": [
1104,
576
]
},
{
"parameters": {
"url": "http://pocketbase-fftm1vu8twxfixup17v82xwe.169.239.180.130.sslip.io/api/collections/executions/records",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "filter",
"value": "=(n8n_execution_id=\"{{ $json.id }}\")"
}
]
},
"options": {}
},
"id": "9e9f478e-2208-4ce4-a010-52ba2ff3bdde",
"name": "Check Execution Record Exists",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
576
],
"credentials": {
"httpHeaderAuth": {
"id": "HC4oQ8isTW3CEuSC",
"name": "POCKETBASE"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 1
},
"conditions": [
{
"leftValue": "={{ $json.totalItems }}",
"operator": {
"type": "number",
"operation": "gt"
},
"rightValue": 0
}
],
"combinator": "and"
},
"options": {}
},
"id": "aad63ade-7f8b-4147-a424-452d836f8431",
"name": "Execution Record Exists?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
512,
576
]
},
{
"parameters": {
"method": "PATCH",
"url": "={{ \"http://pocketbase-fftm1vu8twxfixup17v82xwe.169.239.180.130.sslip.io/api/collections/executions/records/\" + $json.items[0].id }}",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ { \"status\": $(\"Split Executions Array\").item.json.status, \"started_at\": $(\"Split Executions Array\").item.json.startedAt, \"stopped_at\": $(\"Split Executions Array\").item.json.stoppedAt, \"workflow_n8n_id\": $(\"Split Executions Array\").item.json.workflowId, \"error_message\": ((() => { try { return JSON.parse($('Split Executions Array').item.json.data || '{}')?.resultData?.error?.message || ''; } catch { return ''; } })()) } }}",
"options": {}
},
"id": "95424108-0bcd-4445-a666-5ea8bbc2337d",
"name": "Update Execution Record",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
800,
480
],
"credentials": {
"httpHeaderAuth": {
"id": "HC4oQ8isTW3CEuSC",
"name": "POCKETBASE"
}
}
},
{
"parameters": {
"options": {}
},
"id": "9ad39eac-3880-44b0-9254-04c7fec77760",
"name": "Executions: One At A Time",
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 3,
"position": [
-96,
576
]
},
{
"parameters": {
"method": "POST",
"url": "http://pocketbase-fftm1vu8twxfixup17v82xwe.169.239.180.130.sslip.io/api/collections/executions/records",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ { \"n8n_execution_id\": $(\"Split Executions Array\").item.json.id, \"workflow_n8n_id\": $(\"Split Executions Array\").item.json.workflowId, \"status\": $(\"Split Executions Array\").item.json.status, \"started_at\": $(\"Split Executions Array\").item.json.startedAt, \"stopped_at\": $(\"Split Executions Array\").item.json.stoppedAt, \"error_message\": ((() => { try { return JSON.parse($('Split Executions Array').item.json.data || '{}')?.resultData?.error?.message || ''; } catch { return ''; } })()) } }}",
"options": {}
},
"id": "28f98c6d-0c0d-4aa0-b4ed-3918e8122c2e",
"name": "Create Execution Record",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
800,
672
],
"credentials": {
"httpHeaderAuth": {
"id": "HC4oQ8isTW3CEuSC",
"name": "POCKETBASE"
}
}
}
],
"pinData": {},
"connections": {
"Every 5 Minutes": {
"main": [
[
{
"node": "Fetch n8n Workflows",
"type": "main",
"index": 0
},
{
"node": "Fetch n8n Executions",
"type": "main",
"index": 0
}
]
]
},
"Fetch n8n Workflows": {
"main": [
[
{
"node": "Split Workflows Array",
"type": "main",
"index": 0
}
]
]
},
"Split Workflows Array": {
"main": [
[
{
"node": "Workflows: One At A Time",
"type": "main",
"index": 0
}
]
]
},
"Check Workflow Record Exists": {
"main": [
[
{
"node": "Workflow Record Exists?",
"type": "main",
"index": 0
}
]
]
},
"Workflow Record Exists?": {
"main": [
[
{
"node": "Update Workflow Record",
"type": "main",
"index": 0
}
],
[
{
"node": "Create Workflow Record",
"type": "main",
"index": 0
}
]
]
},
"Update Workflow Record": {
"main": [
[
{
"node": "Workflows: One At A Time",
"type": "main",
"index": 0
}
]
]
},
"Workflows: One At A Time": {
"main": [
[
{
"node": "Workflows Sync Done",
"type": "main",
"index": 0
}
],
[
{
"node": "Check Workflow Record Exists",
"type": "main",
"index": 0
}
]
]
},
"Create Workflow Record": {
"main": [
[
{
"node": "Workflows: One At A Time",
"type": "main",
"index": 0
}
]
]
},
"Fetch n8n Executions": {
"main": [
[
{
"node": "Split Executions Array",
"type": "main",
"index": 0
}
]
]
},
"Split Executions Array": {
"main": [
[
{
"node": "Executions: One At A Time",
"type": "main",
"index": 0
}
]
]
},
"Check Execution Record Exists": {
"main": [
[
{
"node": "Execution Record Exists?",
"type": "main",
"index": 0
}
]
]
},
"Execution Record Exists?": {
"main": [
[
{
"node": "Update Execution Record",
"type": "main",
"index": 0
}
],
[
{
"node": "Create Execution Record",
"type": "main",
"index": 0
}
]
]
},
"Update Execution Record": {
"main": [
[
{
"node": "Executions: One At A Time",
"type": "main",
"index": 0
}
]
]
},
"Executions: One At A Time": {
"main": [
[
{
"node": "Executions Sync Done",
"type": "main",
"index": 0
}
],
[
{
"node": "Check Execution Record Exists",
"type": "main",
"index": 0
}
]
]
},
"Create Execution Record": {
"main": [
[
{
"node": "Executions: One At A Time",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1",
"binaryMode": "separate",
"availableInMCP": true
},
"versionId": "2509116a-170f-4eda-b3d5-93dc714ac8d1",
"meta": {
"aiBuilderAssisted": true,
"builderVariant": "mcp",
"instanceId": "05bcfa3b50919141d3600718ff4b7b2b52a3883525b05573a27ba5ef437ac7fb"
},
"nodeGroups": [],
"id": "cM8YciHiEwpslh1y",
"tags": []
}