← Back to Kontasks
Flows Page Performance Fix Complete
Output
Flows Page Performance Fix
Problem
The /gv/flows page was loading extremely slowly, especially on mobile Firefox, because it was fetching all kontasks for all flows on initial page load - an O(n×m) operation.
Solution: Lazy Loading
Before: Page load → Fetch flows → Fetch ALL kontasks for EACH flow → Render ~5-10s on mobile After: Page load → Fetch flows → Render table immediately User clicks Graph → Fetch graph data async → Render graph <1s initial load
Changes Made
konui/src/ ├── router.ts # +58 lines │ ├── Remove kontask fetching from page load │ └── Add /api/gv/flows/graph-data endpoint │ └── Limits 10 kontasks per flow │ └── Returns raw HTML for injection │ └── views/ └── gv-flows.ts # +53 lines ├── Add loading spinner for graph └── Lazy fetch on Graph tab click
API Endpoint
GET /api/gv/flows/graph-data ?status=active&type=feature&kontaskLimit=10 Returns: HTML (vis.js graph container)
Result
- ✓ Table view loads immediately
- ✓ Graph loads only when requested
- ✓ Loading spinner shows during fetch
- ✓ All 174 tests pass
Commit: ab0d8b4e
Quick Actions
Original Request
No layout configured
Details
Type
General
Status
Completed
Scope
vibetools
Tags
performanceflowsui
Created
10 Jan 2026, 2:39 pm
Updated
10 Jan 2026, 2:39 pm
Created By
claude
🔗 Git Commit
ab0d8b4e
Raw Data
{
"id": "94100570-0cbf-4884-b432-d642de0bcf86",
"type": "general",
"status": "completed",
"title": "Flows Page Performance Fix Complete",
"context": {
"output": "<div style=\"background:#1e1e1e;color:#e0e0e0;padding:20px;border-radius:8px;font-family:'Consolas','Monaco',monospace;\">\n<h2 style=\"font-family:sans-serif;color:#fff;margin:0 0 16px 0;\">Flows Page Performance Fix</h2>\n\n<h3 style=\"font-family:sans-serif;color:#98c379;margin:16px 0 8px 0;\">Problem</h3>\n<p style=\"margin:0 0 16px 0;\">The <code>/gv/flows</code> page was loading extremely slowly, especially on mobile Firefox, because it was fetching all kontasks for all flows on initial page load - an O(n×m) operation.</p>\n\n<h3 style=\"font-family:sans-serif;color:#98c379;margin:16px 0 8px 0;\">Solution: Lazy Loading</h3>\n<pre style=\"background:#2d2d2d;padding:16px;border-radius:6px;overflow-x:auto;line-height:1.6;\">\n<span style=\"color:#7f848e;\">Before:</span>\n Page load → Fetch flows → <span style=\"color:#e06c75;\">Fetch ALL kontasks for EACH flow</span> → Render\n <span style=\"color:#e06c75;\">~5-10s on mobile</span>\n\n<span style=\"color:#7f848e;\">After:</span>\n Page load → Fetch flows → <span style=\"color:#98c379;\">Render table immediately</span>\n User clicks Graph → <span style=\"color:#61afef;\">Fetch graph data async</span> → Render graph\n <span style=\"color:#98c379;\"><1s initial load</span>\n</pre>\n\n<h3 style=\"font-family:sans-serif;color:#98c379;margin:16px 0 8px 0;\">Changes Made</h3>\n<pre style=\"background:#2d2d2d;padding:16px;border-radius:6px;overflow-x:auto;line-height:1.8;\">\n<span style=\"color:#56b6c2;font-weight:bold;\">konui/src/</span>\n├── <span style=\"color:#e5c07b;\">router.ts</span> <span style=\"color:#7f848e;\"># +58 lines</span>\n│ ├── <span style=\"color:#98c379;\">Remove kontask fetching from page load</span>\n│ └── <span style=\"color:#98c379;\">Add /api/gv/flows/graph-data endpoint</span>\n│ └── <span style=\"color:#7f848e;\">Limits 10 kontasks per flow</span>\n│ └── <span style=\"color:#7f848e;\">Returns raw HTML for injection</span>\n│\n└── <span style=\"color:#56b6c2;\">views/</span>\n └── <span style=\"color:#e5c07b;\">gv-flows.ts</span> <span style=\"color:#7f848e;\"># +53 lines</span>\n ├── <span style=\"color:#98c379;\">Add loading spinner for graph</span>\n └── <span style=\"color:#98c379;\">Lazy fetch on Graph tab click</span>\n</pre>\n\n<h3 style=\"font-family:sans-serif;color:#98c379;margin:16px 0 8px 0;\">API Endpoint</h3>\n<pre style=\"background:#2d2d2d;padding:12px;border-radius:6px;font-size:0.9em;\">\n<span style=\"color:#c678dd;\">GET</span> <span style=\"color:#61afef;\">/api/gv/flows/graph-data</span>\n <span style=\"color:#7f848e;\">?status=active&type=feature&kontaskLimit=10</span>\n <span style=\"color:#7f848e;\">Returns: HTML (vis.js graph container)</span>\n</pre>\n\n<h3 style=\"font-family:sans-serif;color:#98c379;margin:16px 0 8px 0;\">Result</h3>\n<ul style=\"margin:0;padding-left:20px;line-height:1.8;\">\n<li><span style=\"color:#98c379;\">✓</span> Table view loads immediately</li>\n<li><span style=\"color:#98c379;\">✓</span> Graph loads only when requested</li>\n<li><span style=\"color:#98c379;\">✓</span> Loading spinner shows during fetch</li>\n<li><span style=\"color:#98c379;\">✓</span> All 174 tests pass</li>\n</ul>\n\n<p style=\"margin-top:16px;color:#7f848e;font-size:0.85em;\">Commit: ab0d8b4e</p>\n</div>",
"choices": [
{
"label": "Test on mobile",
"value": "Open /gv/flows on mobile Firefox and verify the table loads fast, then test the Graph tab lazy loading",
"primary": true
},
{
"label": "Reduce limit further",
"value": "The kontaskLimit is currently 10 per flow. Reduce it to 5 for even better mobile performance"
},
{
"label": "Add caching",
"value": "Add client-side caching so the graph data doesn't need to be re-fetched on tab switches"
}
],
"commitSha": "ab0d8b4e"
},
"createdBy": "claude",
"createdAt": "2026-01-10T04:39:21.508Z",
"updatedAt": "2026-01-10T04:39:21.659Z",
"scope": "vibetools",
"tags": [
"performance",
"flows",
"ui"
]
}