← Back to Kontasks
Viewers Invisible to Claude - Simplified Architecture
Analysis of whether viewer concept should be hidden from Claude entirely
Output
Should Viewers Be Invisible to Claude?
SHORT ANSWER: Yes, absolutely.
Viewers are a presentation/security layer concern. Claude should see only: Session, Flow, Turn, Files, Git.
Viewers are a presentation/security layer concern. Claude should see only: Session, Flow, Turn, Files, Git.
What Claude Actually Needs
✓ Session "I'm in a conversation" ✓ Flow "I'm working on a feature" ✓ Turn "This is one request-response" ✓ Files "Here's the code" ✓ Git "Here's the history" ✓ Kontasks "Here's what I did before" ✗ Viewers "Who's watching?" - IRRELEVANT ✗ Users "Who typed this?" - IRRELEVANT ✗ Auth "Are they allowed?" - IRRELEVANT
The Vibe Coding Philosophy
Vibe coding is about flow state - the code, the task, the momentum. Viewer tracking is operational overhead that breaks the vibe.
| Vibe Layer (Claude sees) | Ops Layer (Hub handles) |
| "Continue the auth feature" | Who submitted this prompt? |
| "Here's the flow context" | Who can see the response? |
| "Commit to main branch" | Log who triggered it |
| "Create kontask with result" | Route to connected viewers |
Refined Architecture
Claude's World (gvShell/Agent) ├── Session { id, flowId, config } ├── Flow { id, title, type, status } ├── Turn { prompt, response, toolCalls } ├── Kontasks { recent summaries } └── Git { branch, commits } Hub's World (konui/gvHub) ├── Viewers { connections, devices } ├── Auth { tokens, roles, permissions } ├── Routing { who sees what } └── Audit { who did what, when } Boundary └── Hub intercepts prompts, strips viewer info └── Hub receives responses, routes to viewers └── Claude never knows, never cares
What This Simplifies
- konui_turn_context - No viewer data, just session/flow/kontasks
- CLAUDE.md - No mention of viewers, simpler mental model
- gvFlow types - Remove GvViewer from types Claude sees
- System prompts - No "current user" injection needed
- Kontask creation - No targetUser, just create it - Hub routes
The One Exception
Prompt source tracking - for multi-device scenarios, Claude might need to know "this came from mobile" vs "this came from desktop" for response formatting. But that's device, not viewer identity.
// Good - device context prompt.source = { device: "mobile", viewport: "small" } // Bad - viewer identity prompt.source = { userId: "stephanie", role: "admin" }
Conclusion: Yes, hide viewers from Claude entirely. The platform routes, Claude codes. That's the vibe.
Quick Actions
Original Request
No layout configured
Details
Type
General
Status
Completed
Scope
vibetools
Tags
architectureclaudeviewerssimplification
Created
9 Jan 2026, 9:05 pm
Updated
9 Jan 2026, 9:05 pm
Timing
⏱️ 55.9s
0 tools
● TTFE 1%
● Thinking 99%
● Tools 0%
Created By
claude
📋 Claude's Context
Session
ses_d3abe491...
Raw Data
{
"id": "2288aa51-9dd6-460b-8b9b-ff9a95d6e3df",
"type": "general",
"status": "completed",
"title": "Viewers Invisible to Claude - Simplified Architecture",
"description": "Analysis of whether viewer concept should be hidden from Claude entirely",
"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;\">Should Viewers Be Invisible to Claude?</h2>\n\n<div style=\"background:#2d4a2d;padding:12px;border-radius:6px;border-left:4px solid #22c55e;margin-bottom:16px;\">\n<strong style=\"color:#22c55e;\">SHORT ANSWER: Yes, absolutely.</strong><br/>\n<span style=\"color:#98c379;\">Viewers are a presentation/security layer concern. Claude should see only: Session, Flow, Turn, Files, Git.</span>\n</div>\n\n<h3 style=\"font-family:sans-serif;color:#61afef;margin:16px 0 8px 0;\">What Claude Actually Needs</h3>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<pre style=\"margin:0;color:#e0e0e0;line-height:1.8;\"><span style=\"color:#98c379;\">✓ Session</span> <span style=\"color:#7f848e;\">\"I'm in a conversation\"</span>\n<span style=\"color:#98c379;\">✓ Flow</span> <span style=\"color:#7f848e;\">\"I'm working on a feature\"</span>\n<span style=\"color:#98c379;\">✓ Turn</span> <span style=\"color:#7f848e;\">\"This is one request-response\"</span>\n<span style=\"color:#98c379;\">✓ Files</span> <span style=\"color:#7f848e;\">\"Here's the code\"</span>\n<span style=\"color:#98c379;\">✓ Git</span> <span style=\"color:#7f848e;\">\"Here's the history\"</span>\n<span style=\"color:#98c379;\">✓ Kontasks</span> <span style=\"color:#7f848e;\">\"Here's what I did before\"</span>\n\n<span style=\"color:#f43f5e;\">✗ Viewers</span> <span style=\"color:#7f848e;\">\"Who's watching?\" - IRRELEVANT</span>\n<span style=\"color:#f43f5e;\">✗ Users</span> <span style=\"color:#7f848e;\">\"Who typed this?\" - IRRELEVANT</span>\n<span style=\"color:#f43f5e;\">✗ Auth</span> <span style=\"color:#7f848e;\">\"Are they allowed?\" - IRRELEVANT</span></pre>\n</div>\n\n<h3 style=\"font-family:sans-serif;color:#c678dd;margin:16px 0 8px 0;\">The Vibe Coding Philosophy</h3>\n\n<p style=\"line-height:1.6;margin:0 0 16px 0;\">\nVibe coding is about <strong>flow state</strong> - the code, the task, the momentum. Viewer tracking is <em>operational overhead</em> that breaks the vibe.\n</p>\n\n<table style=\"width:100%;border-collapse:collapse;margin-bottom:16px;\">\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#98c379;font-weight:bold;width:50%;\">Vibe Layer (Claude sees)</td>\n<td style=\"padding:8px;color:#f97316;font-weight:bold;\">Ops Layer (Hub handles)</td>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;\">\"Continue the auth feature\"</td>\n<td style=\"padding:8px;\">Who submitted this prompt?</td>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;\">\"Here's the flow context\"</td>\n<td style=\"padding:8px;\">Who can see the response?</td>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;\">\"Commit to main branch\"</td>\n<td style=\"padding:8px;\">Log who triggered it</td>\n</tr>\n<tr>\n<td style=\"padding:8px;\">\"Create kontask with result\"</td>\n<td style=\"padding:8px;\">Route to connected viewers</td>\n</tr>\n</table>\n\n<h3 style=\"font-family:sans-serif;color:#e5c07b;margin:16px 0 8px 0;\">Refined Architecture</h3>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<pre style=\"margin:0;color:#e0e0e0;font-size:13px;line-height:1.8;\">\n<span style=\"color:#c678dd;font-weight:bold;\">Claude's World</span> (gvShell/Agent)\n├── Session { id, flowId, config }\n├── Flow { id, title, type, status }\n├── Turn { prompt, response, toolCalls }\n├── Kontasks { recent summaries }\n└── Git { branch, commits }\n\n<span style=\"color:#f97316;font-weight:bold;\">Hub's World</span> (konui/gvHub)\n├── Viewers { connections, devices }\n├── Auth { tokens, roles, permissions }\n├── Routing { who sees what }\n└── Audit { who did what, when }\n\n<span style=\"color:#56b6c2;font-weight:bold;\">Boundary</span>\n└── Hub intercepts prompts, strips viewer info\n└── Hub receives responses, routes to viewers\n└── Claude never knows, never cares</pre>\n</div>\n\n<h3 style=\"font-family:sans-serif;color:#98c379;margin:16px 0 8px 0;\">What This Simplifies</h3>\n\n<ol style=\"margin:0 0 16px 0;line-height:1.8;\">\n<li><span style=\"color:#e5c07b;\">konui_turn_context</span> - No viewer data, just session/flow/kontasks</li>\n<li><span style=\"color:#e5c07b;\">CLAUDE.md</span> - No mention of viewers, simpler mental model</li>\n<li><span style=\"color:#e5c07b;\">gvFlow types</span> - Remove GvViewer from types Claude sees</li>\n<li><span style=\"color:#e5c07b;\">System prompts</span> - No \"current user\" injection needed</li>\n<li><span style=\"color:#e5c07b;\">Kontask creation</span> - No targetUser, just create it - Hub routes</li>\n</ol>\n\n<h3 style=\"font-family:sans-serif;color:#56b6c2;margin:16px 0 8px 0;\">The One Exception</h3>\n\n<p style=\"line-height:1.6;margin:0 0 12px 0;\">\n<strong>Prompt source tracking</strong> - for multi-device scenarios, Claude might need to know \"this came from mobile\" vs \"this came from desktop\" for response formatting. But that's <em>device</em>, not <em>viewer identity</em>.\n</p>\n\n<div style=\"background:#2d2d2d;padding:12px;border-radius:6px;margin-bottom:16px;\">\n<pre style=\"margin:0;color:#e0e0e0;\"><span style=\"color:#7f848e;\">// Good - device context</span>\nprompt.source = { device: \"mobile\", viewport: \"small\" }\n\n<span style=\"color:#7f848e;\">// Bad - viewer identity</span>\n<span style=\"text-decoration:line-through;color:#f43f5e;\">prompt.source = { userId: \"stephanie\", role: \"admin\" }</span></pre>\n</div>\n\n<div style=\"margin-top:20px;padding:12px;background:#2d4a2d;border-radius:6px;border-left:4px solid #22c55e;\">\n<strong style=\"color:#22c55e;\">Conclusion:</strong> Yes, hide viewers from Claude entirely. The platform routes, Claude codes. That's the vibe.\n</div>\n\n</div>",
"requestedAt": "2026-01-09T00:00:00.000Z",
"requestId": "cd6ec822-b179-43c7-9c2a-8e1772325dc6",
"choices": [
{
"label": "Refactor types now",
"value": "Refactor gv-flow-types.ts to remove viewer/user concepts from Claude-facing types, keeping them only in Hub layer",
"primary": true
},
{
"label": "Update CLAUDE.md",
"value": "Update CLAUDE.md to remove all viewer/user references from gvFlow and kontask documentation"
},
{
"label": "Document in gvPlatformVision",
"value": "Add this architectural decision to /gv/docs/gvPlatformVision.md - separation of Vibe Layer and Ops Layer"
}
],
"turnTiming": {
"totalMs": 55857,
"ttfeMs": 380,
"thinkingMs": 55477,
"toolExecutionMs": 0,
"toolCallCount": 0,
"thinkingPct": 99,
"toolsPct": 0,
"ttfePct": 1
}
},
"createdBy": "claude",
"createdAt": "2026-01-09T11:05:35.185Z",
"updatedAt": "2026-01-09T11:05:40.283Z",
"targetUser": "claude",
"requestId": "cd6ec822-b179-43c7-9c2a-8e1772325dc6",
"scope": "vibetools",
"tags": [
"architecture",
"claude",
"viewers",
"simplification"
],
"sessionId": "ses_d3abe491-395",
"flowId": "flow_01KEGVRXHHK7E25VFSX4HCV289",
"flowLinks": [
{
"flowId": "flow_01KEGVRXHHK7E25VFSX4HCV289",
"edgeType": "evidence",
"createdAt": "2026-01-09T11:05:35.185Z"
}
]
}