Side by side
Vel vs React & Flutter
The exact same searchable user list in Vel and React + Tailwind — then how the three approaches compare. One source compiles to a native binary; no browser runtime, no bundled engine.
Vel ≈ 78 tokens
#UserList @users: std::vector<User> = await fetchUsers() @filter = "" V g=md p=lg In placeholder="Search…" value=$filter List of=$users as=u Card -> click => open(u.id) H g=sm Avatar src=$u.avatar V T $u.name font=bold T $u.email fg=fgMuted
React + Tailwind ≈ 182 tokens
import { useState, useEffect } from "react";
export function UserList() {
const [users, setUsers] = useState([]);
const [filter, setFilter] = useState("");
useEffect(() => { fetchUsers().then(setUsers); }, []);
return (
<div className="flex flex-col gap-4 p-6">
<input
className="rounded-md border px-3 py-2"
placeholder="Search…"
value={filter}
onChange={(e) => setFilter(e.target.value)}
/>
{users.map((u) => (
<div
key={u.id}
onClick={() => open(u.id)}
className="flex items-center gap-2 rounded-lg
border p-4 hover:bg-gray-50 cursor-pointer"
>
<img className="h-9 w-9 rounded-full" src={u.avatar} />
<div className="flex flex-col">
<span className="font-bold">{u.name}</span>
<span className="text-gray-500">{u.email}</span>
</div>
</div>
))}
</div>
);
} How they compare
| Vel | React + Tailwind | Flutter | |
|---|---|---|---|
| Output | Native binary | Browser / Electron | Native (bundled engine) |
| Rendering | Analytic SDF → WebGPU | DOM + browser compositor | Impeller / Skia |
| Language | .vel → idiomatic C++ | JSX / TypeScript | Dart |
| State | Signals (fine-grained) | Hooks + re-render | setState / streams |
| Idle CPU | ~0 — damage-tracked | reconciler + GC | repaints on vsync |
| Big-list relayout | ~93× (cached) | virtualization needed | ListView.builder |
| Engine size | libvel ~11 MB | framework + bundler | Flutter engine ~7 MB+ |
| A11y on canvas | semantic-tree mirror | native DOM | Semantics tree |
The token (vel bench token — 2.40× fewer than React)
and relayout (vel bench layout) numbers are measured Vel-vs-React;
the React snippet is the idiomatic equivalent (YMMV with abstraction). The Flutter column is
architectural — it isn’t in the token benchmark, so we describe its approach rather than quote
numbers we didn’t measure. Methodology comes from our in-house benchmarks.