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)
Dashboard:
- Dark theme by default (zinc-950 background, high-contrast status colors)
- Layout: sticky header with live status, hero HealthBanner, FailuresPanel,
AnomaliesPanel, 2-col grid (Workflows + Activity), StatsStrip footer
- Auto-detected anomalies: stale active workflows, 100% fail rate, stuck running
- Click any failure/activity row → links to n8n execution view (VITE_N8N_URL)
- VITE_N8N_URL env var threaded through Dockerfile + compose
Poller (poller.n8n.json):
- Fetch n8n Executions: includeData false → true (now includes execution data)
- Create/Update Execution Record: extract error_message from data.resultData.error
using a safe IIFE that JSON.parses the data field
Also:
- Added vite-env.d.ts so VITE_* env vars are typed
- docker-compose.yml: VITE_N8N_URL added to build args
- .env.example: documented VITE_N8N_URL at root and dashboard level
- Swapped placeholder pocketbase.apphub.co.za for the real PB URL in all 6 PB-facing nodes
- Updated setup note to reflect that URL is pre-set
- Collections are already created in PB