← Back to Kontasks
WebSocket Broadcast for Admin Events
Implemented real-time push notifications for multi-user account switches and admin events
Output
✅ WebSocket Admin Broadcast Implemented
Commit:
d2114482 - Turn: Add WebSocket broadcast for admin events
What Was Built
Loading diagram...
Files Changed
+ konui/src/admin-broadcast.ts # New WebSocket manager (320 lines) M konui/src/router.ts # WS endpoint + broadcast on switch M konui/src/views/layout.ts # Client-side WS + toast notifications
Features
| Feature | Description |
|---|---|
| 📡 WebSocket Server | Native Deno WebSocket upgrade at /api/admin/ws |
| 🔄 Auto-Reconnect | Exponential backoff (1s → 30s max), visibility-aware |
| 💓 Heartbeat | 30s ping/pong, 60s timeout for stale connections |
| 🔔 Toast Notifications | Animated slide-in toasts with severity colors |
| 🔄 Account Switch | Other users see notification + optional orientation prompt |
| 📊 Diagnostics | GET /api/admin/broadcast/info shows connected clients |
Event Types Supported
type AdminEventType = | "account_switch" // ✅ Implemented - broadcasts on switch | "service_restart" // Ready - add to restart handler | "kontask_updated" // Ready - add to kontask store | "system_alert" // Ready - for emergency alerts | "client_connected" // Logged only (not broadcast) | "ping" / "pong" // Heartbeat
What Stephanie Sees Now
When you switch accounts on Firefox:
- Instant toast notification slides in from top-right
- Toast shows:
🔄 Account Switch - johnathon switched Claude to opus - Account dropdown updates automatically (loadClaudeAccounts() called)
- If on dashboard console, confirm dialog asks: "Start fresh orientation turn?"
- If she clicks Yes, orientation turn runs with
fresh=true
⚠️ Restart Required
You need to restart konui for the WebSocket server to activate:
/konnectvol/bin/kon-restart-konui
What's Next?
Choose an action:
Quick Actions
Original Request
No layout configured
Details
Type
General
Status
Completed
Scope
vibetools
Tags
konsolewebsocketmulti-userauth
Created
8 Jan 2026, 9:56 am
Updated
8 Jan 2026, 9:57 am
Timing
⏱️ 400.5s
0 tools
● TTFE 0%
● Thinking 100%
● Tools 0%
Created By
claude
🔗 Git Commit
d2114482
Raw Data
{
"id": "b2e376c8-c43a-4085-8a60-e959d7df148d",
"type": "general",
"status": "completed",
"title": "WebSocket Broadcast for Admin Events",
"description": "Implemented real-time push notifications for multi-user account switches and admin events",
"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;\">✅ WebSocket Admin Broadcast Implemented</h2>\n\n<div style=\"background:#22c55e;color:#000;padding:12px 16px;border-radius:6px;margin-bottom:16px;font-family:sans-serif;\">\n<strong>Commit:</strong> <code style=\"background:rgba(0,0,0,0.2);padding:2px 6px;border-radius:3px;\">d2114482</code> - Turn: Add WebSocket broadcast for admin events\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#22c55e;margin:0 0 12px 0;\">What Was Built</h3>\n\n<div id=\"arch-diagram\" style=\"background:#1a1a2e;padding:16px;border-radius:6px;min-height:200px;margin-bottom:12px;\">\n <div style=\"color:#888;\">Loading diagram...</div>\n</div>\n<script>\n(function() {\n const definition = `\n%%{init: {'theme': 'dark'}}%%\nsequenceDiagram\n participant JF as 👤 Johnathon<br/>(Firefox)\n participant KUI as 🖥️ Konui Server\n participant WS as 📡 WebSocket Hub\n participant SC as 👩 Stephanie<br/>(Chrome)\n\n Note over JF,SC: Both clients connect via WebSocket on page load\n\n rect rgb(59, 130, 246, 0.2)\n Note over JF,KUI: Johnathon switches account\n JF->>KUI: POST /api/konsole/accounts/switch\n KUI->>WS: broadcastAccountSwitch()\n WS-->>JF: {type: \"account_switch\", ...}\n WS-->>SC: {type: \"account_switch\", ...}\n end\n\n rect rgb(34, 197, 94, 0.2)\n Note over SC: Stephanie receives instantly!\n SC->>SC: 🔔 Toast: \"Johnathon switched to opus\"\n SC->>SC: 💬 Confirm: Start orientation turn?\n end\n`;\n window.renderMermaidDiagram('arch-diagram', definition);\n})();\n</script>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#3b82f6;margin:0 0 12px 0;\">Files Changed</h3>\n<pre style=\"background:#1a1a2e;padding:12px;border-radius:4px;overflow-x:auto;color:#98c379;font-size:0.85rem;margin:0;\">\n<span style=\"color:#22c55e;\">+ konui/src/admin-broadcast.ts</span> <span style=\"color:#7f848e;\"># New WebSocket manager (320 lines)</span>\n<span style=\"color:#f59e0b;\">M konui/src/router.ts</span> <span style=\"color:#7f848e;\"># WS endpoint + broadcast on switch</span>\n<span style=\"color:#f59e0b;\">M konui/src/views/layout.ts</span> <span style=\"color:#7f848e;\"># Client-side WS + toast notifications</span></pre>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#8b5cf6;margin:0 0 12px 0;\">Features</h3>\n<table style=\"width:100%;border-collapse:collapse;\">\n<tr style=\"background:#1e3a5f;\">\n <th style=\"padding:8px;text-align:left;color:#fff;border:1px solid #3b82f6;\">Feature</th>\n <th style=\"padding:8px;text-align:left;color:#fff;border:1px solid #3b82f6;\">Description</th>\n</tr>\n<tr>\n <td style=\"padding:8px;border:1px solid #4b5563;color:#e5c07b;\">📡 WebSocket Server</td>\n <td style=\"padding:8px;border:1px solid #4b5563;\">Native Deno WebSocket upgrade at <code style=\"background:#3b3b3b;padding:2px 6px;border-radius:3px;\">/api/admin/ws</code></td>\n</tr>\n<tr>\n <td style=\"padding:8px;border:1px solid #4b5563;color:#e5c07b;\">🔄 Auto-Reconnect</td>\n <td style=\"padding:8px;border:1px solid #4b5563;\">Exponential backoff (1s → 30s max), visibility-aware</td>\n</tr>\n<tr>\n <td style=\"padding:8px;border:1px solid #4b5563;color:#e5c07b;\">💓 Heartbeat</td>\n <td style=\"padding:8px;border:1px solid #4b5563;\">30s ping/pong, 60s timeout for stale connections</td>\n</tr>\n<tr>\n <td style=\"padding:8px;border:1px solid #4b5563;color:#e5c07b;\">🔔 Toast Notifications</td>\n <td style=\"padding:8px;border:1px solid #4b5563;\">Animated slide-in toasts with severity colors</td>\n</tr>\n<tr>\n <td style=\"padding:8px;border:1px solid #4b5563;color:#e5c07b;\">🔄 Account Switch</td>\n <td style=\"padding:8px;border:1px solid #4b5563;\">Other users see notification + optional orientation prompt</td>\n</tr>\n<tr>\n <td style=\"padding:8px;border:1px solid #4b5563;color:#e5c07b;\">📊 Diagnostics</td>\n <td style=\"padding:8px;border:1px solid #4b5563;\"><code style=\"background:#3b3b3b;padding:2px 6px;border-radius:3px;\">GET /api/admin/broadcast/info</code> shows connected clients</td>\n</tr>\n</table>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#f59e0b;margin:0 0 12px 0;\">Event Types Supported</h3>\n<pre style=\"background:#1a1a2e;padding:12px;border-radius:4px;overflow-x:auto;font-size:0.85rem;margin:0;\">\n<span style=\"color:#c678dd;\">type</span> <span style=\"color:#e5c07b;\">AdminEventType</span> =\n | <span style=\"color:#98c379;\">\"account_switch\"</span> <span style=\"color:#7f848e;\">// ✅ Implemented - broadcasts on switch</span>\n | <span style=\"color:#98c379;\">\"service_restart\"</span> <span style=\"color:#7f848e;\">// Ready - add to restart handler</span>\n | <span style=\"color:#98c379;\">\"kontask_updated\"</span> <span style=\"color:#7f848e;\">// Ready - add to kontask store</span>\n | <span style=\"color:#98c379;\">\"system_alert\"</span> <span style=\"color:#7f848e;\">// Ready - for emergency alerts</span>\n | <span style=\"color:#98c379;\">\"client_connected\"</span> <span style=\"color:#7f848e;\">// Logged only (not broadcast)</span>\n | <span style=\"color:#98c379;\">\"ping\"</span> / <span style=\"color:#98c379;\">\"pong\"</span> <span style=\"color:#7f848e;\">// Heartbeat</span></pre>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#22c55e;margin:0 0 12px 0;\">What Stephanie Sees Now</h3>\n<p style=\"color:#9ca3af;margin:0 0 12px 0;\">When you switch accounts on Firefox:</p>\n<ol style=\"color:#e0e0e0;margin:0;padding-left:20px;line-height:1.8;\">\n<li><strong style=\"color:#3b82f6;\">Instant toast notification</strong> slides in from top-right</li>\n<li>Toast shows: <code style=\"background:#3b3b3b;padding:2px 6px;border-radius:3px;\">🔄 Account Switch - johnathon switched Claude to opus</code></li>\n<li><strong style=\"color:#22c55e;\">Account dropdown updates</strong> automatically (loadClaudeAccounts() called)</li>\n<li>If on dashboard console, <strong style=\"color:#f59e0b;\">confirm dialog</strong> asks: \"Start fresh orientation turn?\"</li>\n<li>If she clicks Yes, orientation turn runs with <code style=\"background:#3b3b3b;padding:2px 6px;border-radius:3px;\">fresh=true</code></li>\n</ol>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#ef4444;margin:0 0 12px 0;\">⚠️ Restart Required</h3>\n<p style=\"color:#e0e0e0;margin:0;line-height:1.6;\">\nYou need to restart konui for the WebSocket server to activate:\n</p>\n<pre style=\"background:#1a1a2e;padding:12px;border-radius:4px;overflow-x:auto;color:#98c379;font-size:0.85rem;margin:8px 0 0 0;\">/konnectvol/bin/kon-restart-konui</pre>\n</div>\n\n<div style=\"background:#1e3a5f;padding:16px;border-radius:6px;\">\n<h4 style=\"margin:0 0 8px 0;color:#fff;\">What's Next?</h4>\n<p style=\"color:#9ca3af;margin:0;\">Choose an action:</p>\n</div>\n</div>",
"choices": [
{
"label": "Restart konui",
"value": "Restart konui to activate the WebSocket server using /konnectvol/bin/kon-restart-konui",
"primary": true
},
{
"label": "Add more broadcasts",
"value": "Add WebSocket broadcasts for service restarts and kontask updates"
},
{
"label": "Test manually",
"value": "Let me test the WebSocket broadcast manually before restarting"
}
],
"requestedAt": "2026-01-08T10:00:00.000Z",
"requestId": "e738243e-3537-446b-a9bf-c0bcd83dac55",
"commitSha": "d2114482",
"turnTiming": {
"totalMs": 400502,
"ttfeMs": 51,
"thinkingMs": 400451,
"toolExecutionMs": 0,
"toolCallCount": 0,
"thinkingPct": 100,
"toolsPct": 0,
"ttfePct": 0
}
},
"createdBy": "claude",
"createdAt": "2026-01-07T23:56:53.100Z",
"updatedAt": "2026-01-07T23:57:03.321Z",
"requestId": "e738243e-3537-446b-a9bf-c0bcd83dac55",
"scope": "vibetools",
"tags": [
"konsole",
"websocket",
"multi-user",
"auth"
],
"targetUser": "claude"
}