← Back to Kontasks
Why Deno + HTML Instead of Rust/React SPA?
Architectural decision rationale for current tech stack choice
Output
Why Not Rust + React SPA?
Short Answer: Claude Can't Build SPAs (Yet)
The current stack was chosen because Claude Code can rapidly iterate on it. Rust/React would require tooling Claude struggles with.
Key Constraints
| Build Tooling | Vite/Webpack/Turbopack configs are fragile. Claude breaks them often, then spends hours debugging. |
| Type Systems | Rust's borrow checker + TypeScript's strict mode = 2x the compilation errors to debug. |
| Hot Reload | Server-rendered HTML changes instantly. React HMR breaks in weird ways. |
| Dependencies | Node modules + Cargo = 500MB of deps. Deno has zero build step. |
What Claude Excels At
- Inline HTML: Server generates complete pages, no hydration
- Vanilla JS: No bundler, no transpiler, just
<script>tags - Deno: TypeScript runs directly, single binary, fast startup
- SSE: Native browser API, no WebSocket libraries needed
Trade-offs Accepted
| We Lose | We Gain |
|---|---|
| Component reusability | 10x faster iteration |
| Type-safe client code | Claude can modify anything instantly |
| Rust's performance | Deno is fast enough (V8 + native) |
| React ecosystem | No npm audit, no CVEs, no breaking changes |
When Would Rust/React Make Sense?
- Production SaaS: Multiple developers, long-term maintenance
- High concurrency: 1000+ simultaneous streams (Rust async)
- Complex UI: Drag-drop, real-time collaboration, offline-first
- Team has expertise: Existing Rust/React developers
For a vibetools internal tool with one primary user, the current stack is optimal.
What's Next?
Choose an action:
Quick Actions
Original Request
No layout configured
Details
Type
General
Status
Completed
Scope
vibetools
Tags
architecturedecisionstech-stack
Created
3 Jan 2026, 12:47 pm
Updated
3 Jan 2026, 12:47 pm
Created By
claude
Raw Data
{
"id": "2838d8a7-0900-4c31-9e81-92f90853f507",
"type": "general",
"status": "completed",
"title": "Why Deno + HTML Instead of Rust/React SPA?",
"description": "Architectural decision rationale for current tech stack choice",
"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;\">Why Not Rust + React SPA?</h2>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#98c379;margin:0 0 12px 0;\">Short Answer: Claude Can't Build SPAs (Yet)</h3>\n<p style=\"margin:0;line-height:1.6;\">The current stack was chosen because <strong>Claude Code</strong> can rapidly iterate on it. Rust/React would require tooling Claude struggles with.</p>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#61afef;margin:0 0 12px 0;\">Key Constraints</h3>\n<table style=\"width:100%;border-collapse:collapse;\">\n<tr style=\"border-bottom:1px solid #3d3d3d;\">\n<td style=\"padding:10px 0;width:40%;\"><strong style=\"color:#e5c07b;\">Build Tooling</strong></td>\n<td style=\"padding:10px 0;color:#9ca3af;\">Vite/Webpack/Turbopack configs are fragile. Claude breaks them often, then spends hours debugging.</td>\n</tr>\n<tr style=\"border-bottom:1px solid #3d3d3d;\">\n<td style=\"padding:10px 0;\"><strong style=\"color:#e5c07b;\">Type Systems</strong></td>\n<td style=\"padding:10px 0;color:#9ca3af;\">Rust's borrow checker + TypeScript's strict mode = 2x the compilation errors to debug.</td>\n</tr>\n<tr style=\"border-bottom:1px solid #3d3d3d;\">\n<td style=\"padding:10px 0;\"><strong style=\"color:#e5c07b;\">Hot Reload</strong></td>\n<td style=\"padding:10px 0;color:#9ca3af;\">Server-rendered HTML changes instantly. React HMR breaks in weird ways.</td>\n</tr>\n<tr>\n<td style=\"padding:10px 0;\"><strong style=\"color:#e5c07b;\">Dependencies</strong></td>\n<td style=\"padding:10px 0;color:#9ca3af;\">Node modules + Cargo = 500MB of deps. Deno has zero build step.</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:#c678dd;margin:0 0 12px 0;\">What Claude Excels At</h3>\n<ul style=\"margin:0;padding-left:20px;line-height:1.8;\">\n<li><strong>Inline HTML:</strong> Server generates complete pages, no hydration</li>\n<li><strong>Vanilla JS:</strong> No bundler, no transpiler, just <code style=\"background:#3d3d3d;padding:2px 6px;border-radius:3px;\"><script></code> tags</li>\n<li><strong>Deno:</strong> TypeScript runs directly, single binary, fast startup</li>\n<li><strong>SSE:</strong> Native browser API, no WebSocket libraries needed</li>\n</ul>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#e5c07b;margin:0 0 12px 0;\">Trade-offs Accepted</h3>\n<table style=\"width:100%;border-collapse:collapse;\">\n<tr style=\"border-bottom:1px solid #3d3d3d;\">\n<th style=\"text-align:left;padding:8px 0;color:#98c379;\">We Lose</th>\n<th style=\"text-align:left;padding:8px 0;color:#61afef;\">We Gain</th>\n</tr>\n<tr style=\"border-bottom:1px solid #3d3d3d;\">\n<td style=\"padding:8px 0;\">Component reusability</td>\n<td style=\"padding:8px 0;\">10x faster iteration</td>\n</tr>\n<tr style=\"border-bottom:1px solid #3d3d3d;\">\n<td style=\"padding:8px 0;\">Type-safe client code</td>\n<td style=\"padding:8px 0;\">Claude can modify anything instantly</td>\n</tr>\n<tr style=\"border-bottom:1px solid #3d3d3d;\">\n<td style=\"padding:8px 0;\">Rust's performance</td>\n<td style=\"padding:8px 0;\">Deno is fast enough (V8 + native)</td>\n</tr>\n<tr>\n<td style=\"padding:8px 0;\">React ecosystem</td>\n<td style=\"padding:8px 0;\">No npm audit, no CVEs, no breaking changes</td>\n</tr>\n</table>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;\">\n<h3 style=\"color:#56b6c2;margin:0 0 12px 0;\">When Would Rust/React Make Sense?</h3>\n<ul style=\"margin:0;padding-left:20px;line-height:1.8;\">\n<li><strong>Production SaaS:</strong> Multiple developers, long-term maintenance</li>\n<li><strong>High concurrency:</strong> 1000+ simultaneous streams (Rust async)</li>\n<li><strong>Complex UI:</strong> Drag-drop, real-time collaboration, offline-first</li>\n<li><strong>Team has expertise:</strong> Existing Rust/React developers</li>\n</ul>\n<p style=\"margin:12px 0 0 0;color:#9ca3af;font-size:0.9em;\">For a vibetools internal tool with one primary user, the current stack is optimal.</p>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-top:16px;font-family:sans-serif;\">\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>",
"requestedAt": "2026-01-03T00:00:00.000Z",
"requestId": "97a94988-6919-44f2-9396-c99bc8f1622e",
"choices": [
{
"label": "Explore migration",
"value": "What would it take to migrate konui to a React SPA in the future?",
"primary": false
},
{
"label": "Improve current stack",
"value": "What improvements could we make to the current Deno/HTML stack?"
},
{
"label": "Performance comparison",
"value": "How does current Deno performance compare to what Rust would offer?"
}
]
},
"createdBy": "claude",
"createdAt": "2026-01-03T02:47:23.476Z",
"updatedAt": "2026-01-03T02:47:23.630Z",
"requestId": "97a94988-6919-44f2-9396-c99bc8f1622e",
"scope": "vibetools",
"tags": [
"architecture",
"decisions",
"tech-stack"
],
"targetUser": "claude"
}