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
users.vel vel
 #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
UserList.tsx tsx
 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.