A conversational development environment for creating elements through dialogue
The Oven is a special canvas where you develop elements by talking to them. Drop an element in, describe changes, watch it update instantly. Create variations, compare side-by-side, iterate rapidly. When you're happy with a result, pull it outβit's done.
The metaphor:
Current workflow:
The Oven workflow:
The canvas becomes a workshop where you build tools through conversation.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π₯ THE OVEN [Close] [Γ] β
βββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββ€
β β β
β ββββββββββββ ββββββββββββ β π¬ Chat β
β β π β β π β β ββββββββββββββββββββ β
β β Chart β β Chart β β β
β β v1 β β v2 β β You: make the bars β
β β [Fork] β β [Fork] β β thicker β
β ββββββββββββ ββββββββββββ β β
β β π₯: Applied changes β
β ββββββββββββ β Recompiling... β
β β π β β Done β β
β β Chart β β β
β β v3 β β [Send message] β
β β [Fork] β β β
β ββββββββββββ β ββββββββββββββββββββ β
β β Active: Chart v1 β
β [+ New Element] β Source: 42 lines β
β β Last baked: 2s ago β
βββββββββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββββ
1. Enter the Oven
2. Create or Edit
You: "Create an element that shows GitHub commits as a timeline"
π₯: [Creates initial element]
Shows basic timeline with commit messages
You: "Make the commits clickable"
π₯: [Updates source, recompiles]
Adds click handlers, highlights on hover
You: "Actually, try two versions - one vertical, one horizontal"
π₯: [Forks into two elements]
Both appear side-by-side
3. Iterate and Compare
4. Extract the Winner
β Canvas System - Visual workspace for elements β Element Model - Data structure with x, y, content, data β Bun Runtime - Fast TypeScript compilation (<50ms) β LLM Integration - Chat that understands code β Hot Reload - Watch content changes, re-render
export default {
name: 'oven',
registerElements() {
return [{
symbol: 'π₯',
title: 'The Oven',
label: 'Open development environment',
content_url: '/api/oven/workspace',
default_width: 1200,
default_height: 800,
}];
},
registerHTTP(mux) {
// Compile TypeScript source to executable
mux.handle('POST', '/bake', async (req, res) => {
const { recipe } = await req.json();
const baked = await Bun.build({
entrypoints: ['<stdin>'],
stdin: { contents: recipe, loader: 'ts' }
});
res.json({
output: baked.outputs[0].text,
errors: baked.logs
});
});
// LLM edits source based on user instruction
mux.handle('POST', '/edit-recipe', async (req, res) => {
const { currentRecipe, instruction, elementContext } = await req.json();
// Send to LLM with context about what the element does
const newRecipe = await llmEditSource({
source: currentRecipe,
prompt: instruction,
context: elementContext
});
res.json({ recipe: newRecipe });
});
}
};
// Element in the oven (editable)
{
id: "element-abc",
symbol: "π",
inOven: true, // Marks as editable/hot-reloadable
// The executable source (the "recipe")
content: `
export default function render({ data }) {
return \`
<div class="chart" style="border: 2px solid blue;">
<h3>\${data.title}</h3>
<div class="bars">
\${data.items.map(item => \`
<div class="bar" style="width: \${item.value}%">
\${item.label}: \${item.value}
</div>
\`).join('')}
</div>
</div>
\`;
}
`,
// Runtime data (separate from code)
data: {
title: "Commits by Author",
items: [
{ label: "Alice", value: 45 },
{ label: "Bob", value: 30 }
]
}
}
Client-side execution (fast!):
export function createEditableElement(item: Element) {
const container = document.createElement('div');
// Initial render
const render = compileAndExecute(item.content);
container.innerHTML = render({ data: item.data });
// Watch for source changes
uiState.subscribe(`element.${item.id}.content`, (newSource) => {
try {
const updatedRender = compileAndExecute(newSource);
container.innerHTML = updatedRender({ data: item.data });
showSuccess("β Baked successfully");
} catch (err) {
showError(err.message);
}
});
return container;
}
function compileAndExecute(source: string): Function {
// Bun pre-compiles on server, or use esbuild-wasm in browser
// For MVP: simple transpile (strip types, eval)
const transpiled = source
.replace(/export default function/, 'return function')
.replace(/: \w+/g, ''); // Remove type annotations
return new Function(transpiled)();
}
You: "Show me this GitHub API response as cards"
π₯: [Creates card layout element]
You: "Add avatars and make names bold"
π₯: [Updates styling]
You: "Try a table view too"
π₯: [Forks variation with table layout]
Result: Two elements showing same data, different presentations
You: "Visualize these sales numbers as a bar chart"
π₯: [Creates basic bar chart]
You: "Color bars by region - blue for US, green for EU"
π₯: [Adds conditional styling]
You: "Show me a line chart version"
π₯: [Forks into line chart]
You: "And a pie chart"
π₯: [Another fork]
Result: Three different chart types side-by-side, pick best one
You: "Create a status widget showing server health"
π₯: [Creates widget with status indicators]
You: "Make it update every 5 seconds"
π₯: [Adds polling logic]
You: "Add a mini graph of last 10 datapoints"
π₯: [Adds sparkline]
Result: Production-ready widget built through conversation
Goal: Single editable element with hot reload
Success metric: Edit source, see visual update in < 100ms
Goal: Talk to elements, see changes
Success metric: "make border red" β element updates automatically
Goal: Fork and compare
Success metric: Create 3 variations, compare side-by-side
Goal: Ship finished elements
Success metric: Ship element from oven to production canvas
Active element selection - How do you specify which element to edit?
Error presentation - How do compilation errors feel?
Fork timing - When do variations happen?
Layout strategy - How do multiple elements arrange?
Compilation - Server-side (Bun) or client-side (esbuild-wasm)?
Execution sandbox - How to safely run user code?
State management - Can elements share data?
Persistence - What gets saved?
The Oven transforms QNTX from "place components" to "create components through conversation".
It's not about making programming easierβit's about making creation fluid. The canvas isn't just where you arrange elements, it's where you build them.
This is QNTX as workshop, not warehouse.
Status: Vision (Not Yet Implemented) Updated: 2026-02-27 Next Step: Phase 0 prototype - single editable element with hot reload