What's New
The major capabilities Vel has gained: Windows + WebGPU everywhere, a real in-browser playground, accessibility, big layout-perf wins, sharper text, and a richer component set.
This release is a big one. Vel went from a macOS-only prototype to a cross-platform, web-deployable UI language with measured performance, real accessibility, and a production-feel playground.
Runs everywhere
One WebGPU engine → macOS (Metal), Windows (D3D12), and the browser (WebAssembly) from a single codebase.
~65–93× faster layout
→Text-measure caching turned 20 ms relayouts into sub-millisecond ones.
Real in-browser playground
Edit .vel, see it run in a real isolated app iframe, share a hosted URL.
Accessible on the web
A live DOM mirror gives screen readers, keyboard, and IME a real a11y tree over the GPU canvas.
Platforms: WebGPU everywhere
Vel’s engine (Lume) now targets Dawn/WebGPU as its single GPU abstraction, with native surfaces per platform:
| Platform | Backend | Surface |
|---|---|---|
| macOS | Metal | CAMetalLayer |
| Windows | D3D12 | HWND (DXC runtime auto-deployed) |
| Web | WebGPU | HTML <canvas> via emdawnwebgpu (WASM) |
The same .vel source and the same engine/framework/registry render
identically across all three — no per-platform UI code.
The web: a real, shareable playground
Live, isolated preview
The playground preview is a real <iframe> running the app in its own
browser context (its own WebGPU device) — not a canvas emulation. Edits
stream in over postMessage; no reloads, no flashing.
Hosted-app URLs
Share / Open ↗ produce an app.html#src=… link — that URL is the
running app, openable and shareable standalone.
Devtools-style console
A Console tab streams live engine logs; a Problems tab shows
compiler/interpreter errors with file:line:col and severity.
Editor that feels right
Resizable split, syntax highlighting, a live status pill (Editing… → Live → Error), and Cmd/Ctrl+R re-runs the preview without reloading the page.
Accessibility on a GPU canvas
A canvas has no accessibility tree — so Vel projects one. Each frame, the widget tree is reconciled into a hidden DOM mirror that carries ARIA roles, labels, and state, giving the web build:
- Screen-reader support (the mirror is what NVDA/VoiceOver read)
- Keyboard navigation + Tab focus order
- IME / mobile-keyboard / autofill via a real overlay
<input>for text fields - Focus rings (WCAG 2.4.7) drawn by the engine for every focusable widget
prefers-reduced-motionhonored (WCAG 2.3.3) — animations snap to target
This is a substantial, WCAG-oriented accessibility layer — not a certified compliance claim. Real screen-reader sign-off (NVDA/VoiceOver) is an ongoing verification step.
Sharper, more substantial UI
- Crisp HiDPI text — glyph origins now snap to the physical-pixel grid, so the atlas glyph samples 1:1 instead of getting bilinear-blurred. This is the fix for “text doesn’t feel HD.”
- Real font weights — the bundled fonts are now genuine Inter Regular + SemiBold + JetBrains Mono cuts (they were previously identical copies, so weights didn’t render). Bonus: smaller WASM bundle.
- A more generous default scale — the type ramp and control sizes were bumped a step so default UIs read substantial, not cramped.
- Tactile interaction feedback — every button now has a smooth hover lift
and a press scale-down, so clicks feel physical. Universal across
Btn/IconBtn/Toggle.
New components
Chart
A line / bar / area chart over a numeric series — beautiful with zero data (renders a demo wave), real data fed via the C++ API. Works in both compiled apps and the live playground.
Chart // line, demo data
Chart variant="bar" // bar
Chart variant="area" height=200Splitter, upgraded
The resizable Splitter now shows a resize cursor and forwards theme
changes to its panes — powering the playground’s editor/preview split.
Developer experience
vel new <app>
Scaffolds a working project — app.vel + main.cpp + CMakeLists.txt —
ready to build.
vel dev
Compile app.vel, build, and launch the current project in one command.
vel bench
Run the token + layout benchmarks (see Performance).
vel serve
Serve the web build over HTTP (pure C++, correct application/wasm MIME).
Plus a cross-platform CLI fix: a .gitattributes now pins eol=lf, so the
vel launcher no longer breaks on Windows/autocrlf checkouts.
Performance, in one place
Every claim above is backed by a runnable benchmark. See the full methodology, tables, and reproduction commands on the Performance & Benchmarks page.
Try it now
→Install Vel and spin up your first app — or open the playground and start typing.