No Trees
Components are flat lines with parallel strings — no nesting, no recursive reconciliation. Position is identity.
Build web UIs with flat markup, not nested trees. One line of Markout = one row of your app. No JSX, no virtual DOM trees, no reconciliation complexity.
The iconic framework demo, in one line of Markout:
{button:dec "-" outline} {label:count} {button:inc "+" primary}Compare to React:
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<button onClick={() => setCount(c => c - 1)}>-</button>
<span>{count}</span>
<button onClick={() => setCount(c => c + 1)}>+</button>
</div>
);
}Same result. Zero nesting. Zero build step.
npm install outconceive<div id="app"></div>
<script src="outconceive.js"></script>
<script type="module">
import init, { OutconceiveApp } from './pkg/outconceive.js';
await init();
var app = new Outconceive(new OutconceiveApp());
app.from_markout(`
@card padding:24
| Hello, {input:name}!
| {button:greet "Say Hello" primary}
| {label:message}
@end card
`);
app.mount('app');
app.on('greet', (wasmApp) => {
app.set('message', 'Hello, ' + app.get('name') + '!');
});
</script>